1 /* Random utility Lisp functions.
3 Copyright (C) 1985-1987, 1993-1995, 1997-2014 Free Software Foundation,
6 This file is part of GNU Emacs.
8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
31 #include "character.h"
36 #include "intervals.h"
39 #include "blockinput.h"
40 #if defined (HAVE_X_WINDOWS)
44 Lisp_Object Qstring_lessp
;
45 static Lisp_Object Qstring_collate_lessp
, Qstring_collate_equalp
;
46 static Lisp_Object Qprovide
, Qrequire
;
47 static Lisp_Object Qyes_or_no_p_history
;
48 Lisp_Object Qcursor_in_echo_area
;
49 static Lisp_Object Qwidget_type
;
50 static Lisp_Object Qcodeset
, Qdays
, Qmonths
, Qpaper
;
52 static Lisp_Object Qmd5
, Qsha1
, Qsha224
, Qsha256
, Qsha384
, Qsha512
;
54 static void sort_vector_copy (Lisp_Object
, ptrdiff_t,
55 Lisp_Object
[restrict
], Lisp_Object
[restrict
]);
56 static bool internal_equal (Lisp_Object
, Lisp_Object
, int, bool, Lisp_Object
);
58 DEFUN ("identity", Fidentity
, Sidentity
, 1, 1, 0,
59 doc
: /* Return the argument unchanged. */)
65 DEFUN ("random", Frandom
, Srandom
, 0, 1, 0,
66 doc
: /* Return a pseudo-random number.
67 All integers representable in Lisp, i.e. between `most-negative-fixnum'
68 and `most-positive-fixnum', inclusive, are equally likely.
70 With positive integer LIMIT, return random number in interval [0,LIMIT).
71 With argument t, set the random number seed from the current time and pid.
72 With a string argument, set the seed based on the string's contents.
73 Other values of LIMIT are ignored.
75 See Info node `(elisp)Random Numbers' for more details. */)
82 else if (STRINGP (limit
))
83 seed_random (SSDATA (limit
), SBYTES (limit
));
86 if (INTEGERP (limit
) && 0 < XINT (limit
))
89 /* Return the remainder, except reject the rare case where
90 get_random returns a number so close to INTMASK that the
91 remainder isn't random. */
92 EMACS_INT remainder
= val
% XINT (limit
);
93 if (val
- remainder
<= INTMASK
- XINT (limit
) + 1)
94 return make_number (remainder
);
97 return make_number (val
);
100 /* Heuristic on how many iterations of a tight loop can be safely done
101 before it's time to do a QUIT. This must be a power of 2. */
102 enum { QUIT_COUNT_HEURISTIC
= 1 << 16 };
104 /* Random data-structure functions. */
107 CHECK_LIST_END (Lisp_Object x
, Lisp_Object y
)
109 CHECK_TYPE (NILP (x
), Qlistp
, y
);
112 DEFUN ("length", Flength
, Slength
, 1, 1, 0,
113 doc
: /* Return the length of vector, list or string SEQUENCE.
114 A byte-code function object is also allowed.
115 If the string contains multibyte characters, this is not necessarily
116 the number of bytes in the string; it is the number of characters.
117 To get the number of bytes, use `string-bytes'. */)
118 (register Lisp_Object sequence
)
120 register Lisp_Object val
;
122 if (STRINGP (sequence
))
123 XSETFASTINT (val
, SCHARS (sequence
));
124 else if (VECTORP (sequence
))
125 XSETFASTINT (val
, ASIZE (sequence
));
126 else if (CHAR_TABLE_P (sequence
))
127 XSETFASTINT (val
, MAX_CHAR
);
128 else if (BOOL_VECTOR_P (sequence
))
129 XSETFASTINT (val
, bool_vector_size (sequence
));
130 else if (COMPILEDP (sequence
))
131 XSETFASTINT (val
, ASIZE (sequence
) & PSEUDOVECTOR_SIZE_MASK
);
132 else if (CONSP (sequence
))
139 if ((i
& (QUIT_COUNT_HEURISTIC
- 1)) == 0)
141 if (MOST_POSITIVE_FIXNUM
< i
)
142 error ("List too long");
145 sequence
= XCDR (sequence
);
147 while (CONSP (sequence
));
149 CHECK_LIST_END (sequence
, sequence
);
151 val
= make_number (i
);
153 else if (NILP (sequence
))
154 XSETFASTINT (val
, 0);
156 wrong_type_argument (Qsequencep
, sequence
);
161 DEFUN ("safe-length", Fsafe_length
, Ssafe_length
, 1, 1, 0,
162 doc
: /* Return the length of a list, but avoid error or infinite loop.
163 This function never gets an error. If LIST is not really a list,
164 it returns 0. If LIST is circular, it returns a finite value
165 which is at least the number of distinct elements. */)
168 Lisp_Object tail
, halftail
;
173 return make_number (0);
175 /* halftail is used to detect circular lists. */
176 for (tail
= halftail
= list
; ; )
181 if (EQ (tail
, halftail
))
184 if ((lolen
& 1) == 0)
186 halftail
= XCDR (halftail
);
187 if ((lolen
& (QUIT_COUNT_HEURISTIC
- 1)) == 0)
191 hilen
+= UINTMAX_MAX
+ 1.0;
196 /* If the length does not fit into a fixnum, return a float.
197 On all known practical machines this returns an upper bound on
199 return hilen
? make_float (hilen
+ lolen
) : make_fixnum_or_float (lolen
);
202 DEFUN ("string-bytes", Fstring_bytes
, Sstring_bytes
, 1, 1, 0,
203 doc
: /* Return the number of bytes in STRING.
204 If STRING is multibyte, this may be greater than the length of STRING. */)
207 CHECK_STRING (string
);
208 return make_number (SBYTES (string
));
211 DEFUN ("string-equal", Fstring_equal
, Sstring_equal
, 2, 2, 0,
212 doc
: /* Return t if two strings have identical contents.
213 Case is significant, but text properties are ignored.
214 Symbols are also allowed; their print names are used instead. */)
215 (register Lisp_Object s1
, Lisp_Object s2
)
218 s1
= SYMBOL_NAME (s1
);
220 s2
= SYMBOL_NAME (s2
);
224 if (SCHARS (s1
) != SCHARS (s2
)
225 || SBYTES (s1
) != SBYTES (s2
)
226 || memcmp (SDATA (s1
), SDATA (s2
), SBYTES (s1
)))
231 DEFUN ("compare-strings", Fcompare_strings
, Scompare_strings
, 6, 7, 0,
232 doc
: /* Compare the contents of two strings, converting to multibyte if needed.
233 The arguments START1, END1, START2, and END2, if non-nil, are
234 positions specifying which parts of STR1 or STR2 to compare. In
235 string STR1, compare the part between START1 (inclusive) and END1
236 \(exclusive). If START1 is nil, it defaults to 0, the beginning of
237 the string; if END1 is nil, it defaults to the length of the string.
238 Likewise, in string STR2, compare the part between START2 and END2.
239 Like in `substring', negative values are counted from the end.
241 The strings are compared by the numeric values of their characters.
242 For instance, STR1 is "less than" STR2 if its first differing
243 character has a smaller numeric value. If IGNORE-CASE is non-nil,
244 characters are converted to lower-case before comparing them. Unibyte
245 strings are converted to multibyte for comparison.
247 The value is t if the strings (or specified portions) match.
248 If string STR1 is less, the value is a negative number N;
249 - 1 - N is the number of characters that match at the beginning.
250 If string STR1 is greater, the value is a positive number N;
251 N - 1 is the number of characters that match at the beginning. */)
252 (Lisp_Object str1
, Lisp_Object start1
, Lisp_Object end1
, Lisp_Object str2
,
253 Lisp_Object start2
, Lisp_Object end2
, Lisp_Object ignore_case
)
255 ptrdiff_t from1
, to1
, from2
, to2
, i1
, i1_byte
, i2
, i2_byte
;
260 /* For backward compatibility, silently bring too-large positive end
261 values into range. */
262 if (INTEGERP (end1
) && SCHARS (str1
) < XINT (end1
))
263 end1
= make_number (SCHARS (str1
));
264 if (INTEGERP (end2
) && SCHARS (str2
) < XINT (end2
))
265 end2
= make_number (SCHARS (str2
));
267 validate_subarray (str1
, start1
, end1
, SCHARS (str1
), &from1
, &to1
);
268 validate_subarray (str2
, start2
, end2
, SCHARS (str2
), &from2
, &to2
);
273 i1_byte
= string_char_to_byte (str1
, i1
);
274 i2_byte
= string_char_to_byte (str2
, i2
);
276 while (i1
< to1
&& i2
< to2
)
278 /* When we find a mismatch, we must compare the
279 characters, not just the bytes. */
282 FETCH_STRING_CHAR_AS_MULTIBYTE_ADVANCE (c1
, str1
, i1
, i1_byte
);
283 FETCH_STRING_CHAR_AS_MULTIBYTE_ADVANCE (c2
, str2
, i2
, i2_byte
);
288 if (! NILP (ignore_case
))
290 c1
= XINT (Fupcase (make_number (c1
)));
291 c2
= XINT (Fupcase (make_number (c2
)));
297 /* Note that I1 has already been incremented
298 past the character that we are comparing;
299 hence we don't add or subtract 1 here. */
301 return make_number (- i1
+ from1
);
303 return make_number (i1
- from1
);
307 return make_number (i1
- from1
+ 1);
309 return make_number (- i1
+ from1
- 1);
314 DEFUN ("string-lessp", Fstring_lessp
, Sstring_lessp
, 2, 2, 0,
315 doc
: /* Return t if first arg string is less than second in lexicographic order.
317 Symbols are also allowed; their print names are used instead. */)
318 (register Lisp_Object s1
, Lisp_Object s2
)
320 register ptrdiff_t end
;
321 register ptrdiff_t i1
, i1_byte
, i2
, i2_byte
;
324 s1
= SYMBOL_NAME (s1
);
326 s2
= SYMBOL_NAME (s2
);
330 i1
= i1_byte
= i2
= i2_byte
= 0;
333 if (end
> SCHARS (s2
))
338 /* When we find a mismatch, we must compare the
339 characters, not just the bytes. */
342 FETCH_STRING_CHAR_ADVANCE (c1
, s1
, i1
, i1_byte
);
343 FETCH_STRING_CHAR_ADVANCE (c2
, s2
, i2
, i2_byte
);
346 return c1
< c2
? Qt
: Qnil
;
348 return i1
< SCHARS (s2
) ? Qt
: Qnil
;
351 DEFUN ("string-collate-lessp", Fstring_collate_lessp
, Sstring_collate_lessp
, 2, 4, 0,
352 doc
: /* Return t if first arg string is less than second in collation order.
353 Symbols are also allowed; their print names are used instead.
355 This function obeys the conventions for collation order in your
356 locale settings. For example, punctuation and whitespace characters
357 might be considered less significant for sorting:
359 \(sort '\("11" "12" "1 1" "1 2" "1.1" "1.2") 'string-collate-lessp)
360 => \("11" "1 1" "1.1" "12" "1 2" "1.2")
362 The optional argument LOCALE, a string, overrides the setting of your
363 current locale identifier for collation. The value is system
364 dependent; a LOCALE \"en_US.UTF-8\" is applicable on POSIX systems,
365 while it would be, e.g., \"enu_USA.1252\" on MS-Windows systems.
367 If IGNORE-CASE is non-nil, characters are converted to lower-case
368 before comparing them.
370 To emulate Unicode-compliant collation on MS-Windows systems,
371 bind `w32-collate-ignore-punctuation' to a non-nil value, since
372 the codeset part of the locale cannot be \"UTF-8\" on MS-Windows.
374 If your system does not support a locale environment, this function
375 behaves like `string-lessp'. */)
376 (Lisp_Object s1
, Lisp_Object s2
, Lisp_Object locale
, Lisp_Object ignore_case
)
378 #if defined __STDC_ISO_10646__ || defined WINDOWSNT
379 /* Check parameters. */
381 s1
= SYMBOL_NAME (s1
);
383 s2
= SYMBOL_NAME (s2
);
387 CHECK_STRING (locale
);
389 return (str_collate (s1
, s2
, locale
, ignore_case
) < 0) ? Qt
: Qnil
;
391 #else /* !__STDC_ISO_10646__, !WINDOWSNT */
392 return Fstring_lessp (s1
, s2
);
393 #endif /* !__STDC_ISO_10646__, !WINDOWSNT */
396 DEFUN ("string-collate-equalp", Fstring_collate_equalp
, Sstring_collate_equalp
, 2, 4, 0,
397 doc
: /* Return t if two strings have identical contents.
398 Symbols are also allowed; their print names are used instead.
400 This function obeys the conventions for collation order in your locale
401 settings. For example, characters with different coding points but
402 the same meaning might be considered as equal, like different grave
403 accent Unicode characters:
405 \(string-collate-equalp \(string ?\\uFF40) \(string ?\\u1FEF))
408 The optional argument LOCALE, a string, overrides the setting of your
409 current locale identifier for collation. The value is system
410 dependent; a LOCALE \"en_US.UTF-8\" is applicable on POSIX systems,
411 while it would be \"enu_USA.1252\" on MS Windows systems.
413 If IGNORE-CASE is non-nil, characters are converted to lower-case
414 before comparing them.
416 To emulate Unicode-compliant collation on MS-Windows systems,
417 bind `w32-collate-ignore-punctuation' to a non-nil value, since
418 the codeset part of the locale cannot be \"UTF-8\" on MS-Windows.
420 If your system does not support a locale environment, this function
421 behaves like `string-equal'.
423 Do NOT use this function to compare file names for equality, only
424 for sorting them. */)
425 (Lisp_Object s1
, Lisp_Object s2
, Lisp_Object locale
, Lisp_Object ignore_case
)
427 #if defined __STDC_ISO_10646__ || defined WINDOWSNT
428 /* Check parameters. */
430 s1
= SYMBOL_NAME (s1
);
432 s2
= SYMBOL_NAME (s2
);
436 CHECK_STRING (locale
);
438 return (str_collate (s1
, s2
, locale
, ignore_case
) == 0) ? Qt
: Qnil
;
440 #else /* !__STDC_ISO_10646__, !WINDOWSNT */
441 return Fstring_equal (s1
, s2
);
442 #endif /* !__STDC_ISO_10646__, !WINDOWSNT */
445 static Lisp_Object
concat (ptrdiff_t nargs
, Lisp_Object
*args
,
446 enum Lisp_Type target_type
, bool last_special
);
450 concat2 (Lisp_Object s1
, Lisp_Object s2
)
455 return concat (2, args
, Lisp_String
, 0);
460 concat3 (Lisp_Object s1
, Lisp_Object s2
, Lisp_Object s3
)
466 return concat (3, args
, Lisp_String
, 0);
469 DEFUN ("append", Fappend
, Sappend
, 0, MANY
, 0,
470 doc
: /* Concatenate all the arguments and make the result a list.
471 The result is a list whose elements are the elements of all the arguments.
472 Each argument may be a list, vector or string.
473 The last argument is not copied, just used as the tail of the new list.
474 usage: (append &rest SEQUENCES) */)
475 (ptrdiff_t nargs
, Lisp_Object
*args
)
477 return concat (nargs
, args
, Lisp_Cons
, 1);
480 DEFUN ("concat", Fconcat
, Sconcat
, 0, MANY
, 0,
481 doc
: /* Concatenate all the arguments and make the result a string.
482 The result is a string whose elements are the elements of all the arguments.
483 Each argument may be a string or a list or vector of characters (integers).
484 usage: (concat &rest SEQUENCES) */)
485 (ptrdiff_t nargs
, Lisp_Object
*args
)
487 return concat (nargs
, args
, Lisp_String
, 0);
490 DEFUN ("vconcat", Fvconcat
, Svconcat
, 0, MANY
, 0,
491 doc
: /* Concatenate all the arguments and make the result a vector.
492 The result is a vector whose elements are the elements of all the arguments.
493 Each argument may be a list, vector or string.
494 usage: (vconcat &rest SEQUENCES) */)
495 (ptrdiff_t nargs
, Lisp_Object
*args
)
497 return concat (nargs
, args
, Lisp_Vectorlike
, 0);
501 DEFUN ("copy-sequence", Fcopy_sequence
, Scopy_sequence
, 1, 1, 0,
502 doc
: /* Return a copy of a list, vector, string or char-table.
503 The elements of a list or vector are not copied; they are shared
504 with the original. */)
507 if (NILP (arg
)) return arg
;
509 if (CHAR_TABLE_P (arg
))
511 return copy_char_table (arg
);
514 if (BOOL_VECTOR_P (arg
))
516 EMACS_INT nbits
= bool_vector_size (arg
);
517 ptrdiff_t nbytes
= bool_vector_bytes (nbits
);
518 Lisp_Object val
= make_uninit_bool_vector (nbits
);
519 memcpy (bool_vector_data (val
), bool_vector_data (arg
), nbytes
);
523 if (!CONSP (arg
) && !VECTORP (arg
) && !STRINGP (arg
))
524 wrong_type_argument (Qsequencep
, arg
);
526 return concat (1, &arg
, XTYPE (arg
), 0);
529 /* This structure holds information of an argument of `concat' that is
530 a string and has text properties to be copied. */
533 ptrdiff_t argnum
; /* refer to ARGS (arguments of `concat') */
534 ptrdiff_t from
; /* refer to ARGS[argnum] (argument string) */
535 ptrdiff_t to
; /* refer to VAL (the target string) */
539 concat (ptrdiff_t nargs
, Lisp_Object
*args
,
540 enum Lisp_Type target_type
, bool last_special
)
546 ptrdiff_t toindex_byte
= 0;
547 EMACS_INT result_len
;
548 EMACS_INT result_len_byte
;
550 Lisp_Object last_tail
;
553 /* When we make a multibyte string, we can't copy text properties
554 while concatenating each string because the length of resulting
555 string can't be decided until we finish the whole concatenation.
556 So, we record strings that have text properties to be copied
557 here, and copy the text properties after the concatenation. */
558 struct textprop_rec
*textprops
= NULL
;
559 /* Number of elements in textprops. */
560 ptrdiff_t num_textprops
= 0;
565 /* In append, the last arg isn't treated like the others */
566 if (last_special
&& nargs
> 0)
569 last_tail
= args
[nargs
];
574 /* Check each argument. */
575 for (argnum
= 0; argnum
< nargs
; argnum
++)
578 if (!(CONSP (this) || NILP (this) || VECTORP (this) || STRINGP (this)
579 || COMPILEDP (this) || BOOL_VECTOR_P (this)))
580 wrong_type_argument (Qsequencep
, this);
583 /* Compute total length in chars of arguments in RESULT_LEN.
584 If desired output is a string, also compute length in bytes
585 in RESULT_LEN_BYTE, and determine in SOME_MULTIBYTE
586 whether the result should be a multibyte string. */
590 for (argnum
= 0; argnum
< nargs
; argnum
++)
594 len
= XFASTINT (Flength (this));
595 if (target_type
== Lisp_String
)
597 /* We must count the number of bytes needed in the string
598 as well as the number of characters. */
602 ptrdiff_t this_len_byte
;
604 if (VECTORP (this) || COMPILEDP (this))
605 for (i
= 0; i
< len
; i
++)
608 CHECK_CHARACTER (ch
);
610 this_len_byte
= CHAR_BYTES (c
);
611 if (STRING_BYTES_BOUND
- result_len_byte
< this_len_byte
)
613 result_len_byte
+= this_len_byte
;
614 if (! ASCII_CHAR_P (c
) && ! CHAR_BYTE8_P (c
))
617 else if (BOOL_VECTOR_P (this) && bool_vector_size (this) > 0)
618 wrong_type_argument (Qintegerp
, Faref (this, make_number (0)));
619 else if (CONSP (this))
620 for (; CONSP (this); this = XCDR (this))
623 CHECK_CHARACTER (ch
);
625 this_len_byte
= CHAR_BYTES (c
);
626 if (STRING_BYTES_BOUND
- result_len_byte
< this_len_byte
)
628 result_len_byte
+= this_len_byte
;
629 if (! ASCII_CHAR_P (c
) && ! CHAR_BYTE8_P (c
))
632 else if (STRINGP (this))
634 if (STRING_MULTIBYTE (this))
637 this_len_byte
= SBYTES (this);
640 this_len_byte
= count_size_as_multibyte (SDATA (this),
642 if (STRING_BYTES_BOUND
- result_len_byte
< this_len_byte
)
644 result_len_byte
+= this_len_byte
;
649 if (MOST_POSITIVE_FIXNUM
< result_len
)
650 memory_full (SIZE_MAX
);
653 if (! some_multibyte
)
654 result_len_byte
= result_len
;
656 /* Create the output object. */
657 if (target_type
== Lisp_Cons
)
658 val
= Fmake_list (make_number (result_len
), Qnil
);
659 else if (target_type
== Lisp_Vectorlike
)
660 val
= Fmake_vector (make_number (result_len
), Qnil
);
661 else if (some_multibyte
)
662 val
= make_uninit_multibyte_string (result_len
, result_len_byte
);
664 val
= make_uninit_string (result_len
);
666 /* In `append', if all but last arg are nil, return last arg. */
667 if (target_type
== Lisp_Cons
&& EQ (val
, Qnil
))
670 /* Copy the contents of the args into the result. */
672 tail
= val
, toindex
= -1; /* -1 in toindex is flag we are making a list */
674 toindex
= 0, toindex_byte
= 0;
678 SAFE_NALLOCA (textprops
, 1, nargs
);
680 for (argnum
= 0; argnum
< nargs
; argnum
++)
683 ptrdiff_t thisleni
= 0;
684 register ptrdiff_t thisindex
= 0;
685 register ptrdiff_t thisindex_byte
= 0;
689 thislen
= Flength (this), thisleni
= XINT (thislen
);
691 /* Between strings of the same kind, copy fast. */
692 if (STRINGP (this) && STRINGP (val
)
693 && STRING_MULTIBYTE (this) == some_multibyte
)
695 ptrdiff_t thislen_byte
= SBYTES (this);
697 memcpy (SDATA (val
) + toindex_byte
, SDATA (this), SBYTES (this));
698 if (string_intervals (this))
700 textprops
[num_textprops
].argnum
= argnum
;
701 textprops
[num_textprops
].from
= 0;
702 textprops
[num_textprops
++].to
= toindex
;
704 toindex_byte
+= thislen_byte
;
707 /* Copy a single-byte string to a multibyte string. */
708 else if (STRINGP (this) && STRINGP (val
))
710 if (string_intervals (this))
712 textprops
[num_textprops
].argnum
= argnum
;
713 textprops
[num_textprops
].from
= 0;
714 textprops
[num_textprops
++].to
= toindex
;
716 toindex_byte
+= copy_text (SDATA (this),
717 SDATA (val
) + toindex_byte
,
718 SCHARS (this), 0, 1);
722 /* Copy element by element. */
725 register Lisp_Object elt
;
727 /* Fetch next element of `this' arg into `elt', or break if
728 `this' is exhausted. */
729 if (NILP (this)) break;
731 elt
= XCAR (this), this = XCDR (this);
732 else if (thisindex
>= thisleni
)
734 else if (STRINGP (this))
737 if (STRING_MULTIBYTE (this))
738 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, this,
743 c
= SREF (this, thisindex
); thisindex
++;
744 if (some_multibyte
&& !ASCII_CHAR_P (c
))
745 c
= BYTE8_TO_CHAR (c
);
747 XSETFASTINT (elt
, c
);
749 else if (BOOL_VECTOR_P (this))
751 elt
= bool_vector_ref (this, thisindex
);
756 elt
= AREF (this, thisindex
);
760 /* Store this element into the result. */
767 else if (VECTORP (val
))
769 ASET (val
, toindex
, elt
);
775 CHECK_CHARACTER (elt
);
778 toindex_byte
+= CHAR_STRING (c
, SDATA (val
) + toindex_byte
);
780 SSET (val
, toindex_byte
++, c
);
786 XSETCDR (prev
, last_tail
);
788 if (num_textprops
> 0)
791 ptrdiff_t last_to_end
= -1;
793 for (argnum
= 0; argnum
< num_textprops
; argnum
++)
795 this = args
[textprops
[argnum
].argnum
];
796 props
= text_property_list (this,
798 make_number (SCHARS (this)),
800 /* If successive arguments have properties, be sure that the
801 value of `composition' property be the copy. */
802 if (last_to_end
== textprops
[argnum
].to
)
803 make_composition_value_copy (props
);
804 add_text_properties_from_list (val
, props
,
805 make_number (textprops
[argnum
].to
));
806 last_to_end
= textprops
[argnum
].to
+ SCHARS (this);
814 static Lisp_Object string_char_byte_cache_string
;
815 static ptrdiff_t string_char_byte_cache_charpos
;
816 static ptrdiff_t string_char_byte_cache_bytepos
;
819 clear_string_char_byte_cache (void)
821 string_char_byte_cache_string
= Qnil
;
824 /* Return the byte index corresponding to CHAR_INDEX in STRING. */
827 string_char_to_byte (Lisp_Object string
, ptrdiff_t char_index
)
830 ptrdiff_t best_below
, best_below_byte
;
831 ptrdiff_t best_above
, best_above_byte
;
833 best_below
= best_below_byte
= 0;
834 best_above
= SCHARS (string
);
835 best_above_byte
= SBYTES (string
);
836 if (best_above
== best_above_byte
)
839 if (EQ (string
, string_char_byte_cache_string
))
841 if (string_char_byte_cache_charpos
< char_index
)
843 best_below
= string_char_byte_cache_charpos
;
844 best_below_byte
= string_char_byte_cache_bytepos
;
848 best_above
= string_char_byte_cache_charpos
;
849 best_above_byte
= string_char_byte_cache_bytepos
;
853 if (char_index
- best_below
< best_above
- char_index
)
855 unsigned char *p
= SDATA (string
) + best_below_byte
;
857 while (best_below
< char_index
)
859 p
+= BYTES_BY_CHAR_HEAD (*p
);
862 i_byte
= p
- SDATA (string
);
866 unsigned char *p
= SDATA (string
) + best_above_byte
;
868 while (best_above
> char_index
)
871 while (!CHAR_HEAD_P (*p
)) p
--;
874 i_byte
= p
- SDATA (string
);
877 string_char_byte_cache_bytepos
= i_byte
;
878 string_char_byte_cache_charpos
= char_index
;
879 string_char_byte_cache_string
= string
;
884 /* Return the character index corresponding to BYTE_INDEX in STRING. */
887 string_byte_to_char (Lisp_Object string
, ptrdiff_t byte_index
)
890 ptrdiff_t best_below
, best_below_byte
;
891 ptrdiff_t best_above
, best_above_byte
;
893 best_below
= best_below_byte
= 0;
894 best_above
= SCHARS (string
);
895 best_above_byte
= SBYTES (string
);
896 if (best_above
== best_above_byte
)
899 if (EQ (string
, string_char_byte_cache_string
))
901 if (string_char_byte_cache_bytepos
< byte_index
)
903 best_below
= string_char_byte_cache_charpos
;
904 best_below_byte
= string_char_byte_cache_bytepos
;
908 best_above
= string_char_byte_cache_charpos
;
909 best_above_byte
= string_char_byte_cache_bytepos
;
913 if (byte_index
- best_below_byte
< best_above_byte
- byte_index
)
915 unsigned char *p
= SDATA (string
) + best_below_byte
;
916 unsigned char *pend
= SDATA (string
) + byte_index
;
920 p
+= BYTES_BY_CHAR_HEAD (*p
);
924 i_byte
= p
- SDATA (string
);
928 unsigned char *p
= SDATA (string
) + best_above_byte
;
929 unsigned char *pbeg
= SDATA (string
) + byte_index
;
934 while (!CHAR_HEAD_P (*p
)) p
--;
938 i_byte
= p
- SDATA (string
);
941 string_char_byte_cache_bytepos
= i_byte
;
942 string_char_byte_cache_charpos
= i
;
943 string_char_byte_cache_string
= string
;
948 /* Convert STRING to a multibyte string. */
951 string_make_multibyte (Lisp_Object string
)
958 if (STRING_MULTIBYTE (string
))
961 nbytes
= count_size_as_multibyte (SDATA (string
),
963 /* If all the chars are ASCII, they won't need any more bytes
964 once converted. In that case, we can return STRING itself. */
965 if (nbytes
== SBYTES (string
))
968 buf
= SAFE_ALLOCA (nbytes
);
969 copy_text (SDATA (string
), buf
, SBYTES (string
),
972 ret
= make_multibyte_string ((char *) buf
, SCHARS (string
), nbytes
);
979 /* Convert STRING (if unibyte) to a multibyte string without changing
980 the number of characters. Characters 0200 trough 0237 are
981 converted to eight-bit characters. */
984 string_to_multibyte (Lisp_Object string
)
991 if (STRING_MULTIBYTE (string
))
994 nbytes
= count_size_as_multibyte (SDATA (string
), SBYTES (string
));
995 /* If all the chars are ASCII, they won't need any more bytes once
997 if (nbytes
== SBYTES (string
))
998 return make_multibyte_string (SSDATA (string
), nbytes
, nbytes
);
1000 buf
= SAFE_ALLOCA (nbytes
);
1001 memcpy (buf
, SDATA (string
), SBYTES (string
));
1002 str_to_multibyte (buf
, nbytes
, SBYTES (string
));
1004 ret
= make_multibyte_string ((char *) buf
, SCHARS (string
), nbytes
);
1011 /* Convert STRING to a single-byte string. */
1014 string_make_unibyte (Lisp_Object string
)
1021 if (! STRING_MULTIBYTE (string
))
1024 nchars
= SCHARS (string
);
1026 buf
= SAFE_ALLOCA (nchars
);
1027 copy_text (SDATA (string
), buf
, SBYTES (string
),
1030 ret
= make_unibyte_string ((char *) buf
, nchars
);
1036 DEFUN ("string-make-multibyte", Fstring_make_multibyte
, Sstring_make_multibyte
,
1038 doc
: /* Return the multibyte equivalent of STRING.
1039 If STRING is unibyte and contains non-ASCII characters, the function
1040 `unibyte-char-to-multibyte' is used to convert each unibyte character
1041 to a multibyte character. In this case, the returned string is a
1042 newly created string with no text properties. If STRING is multibyte
1043 or entirely ASCII, it is returned unchanged. In particular, when
1044 STRING is unibyte and entirely ASCII, the returned string is unibyte.
1045 \(When the characters are all ASCII, Emacs primitives will treat the
1046 string the same way whether it is unibyte or multibyte.) */)
1047 (Lisp_Object string
)
1049 CHECK_STRING (string
);
1051 return string_make_multibyte (string
);
1054 DEFUN ("string-make-unibyte", Fstring_make_unibyte
, Sstring_make_unibyte
,
1056 doc
: /* Return the unibyte equivalent of STRING.
1057 Multibyte character codes are converted to unibyte according to
1058 `nonascii-translation-table' or, if that is nil, `nonascii-insert-offset'.
1059 If the lookup in the translation table fails, this function takes just
1060 the low 8 bits of each character. */)
1061 (Lisp_Object string
)
1063 CHECK_STRING (string
);
1065 return string_make_unibyte (string
);
1068 DEFUN ("string-as-unibyte", Fstring_as_unibyte
, Sstring_as_unibyte
,
1070 doc
: /* Return a unibyte string with the same individual bytes as STRING.
1071 If STRING is unibyte, the result is STRING itself.
1072 Otherwise it is a newly created string, with no text properties.
1073 If STRING is multibyte and contains a character of charset
1074 `eight-bit', it is converted to the corresponding single byte. */)
1075 (Lisp_Object string
)
1077 CHECK_STRING (string
);
1079 if (STRING_MULTIBYTE (string
))
1081 unsigned char *str
= (unsigned char *) xlispstrdup (string
);
1082 ptrdiff_t bytes
= str_as_unibyte (str
, SBYTES (string
));
1084 string
= make_unibyte_string ((char *) str
, bytes
);
1090 DEFUN ("string-as-multibyte", Fstring_as_multibyte
, Sstring_as_multibyte
,
1092 doc
: /* Return a multibyte string with the same individual bytes as STRING.
1093 If STRING is multibyte, the result is STRING itself.
1094 Otherwise it is a newly created string, with no text properties.
1096 If STRING is unibyte and contains an individual 8-bit byte (i.e. not
1097 part of a correct utf-8 sequence), it is converted to the corresponding
1098 multibyte character of charset `eight-bit'.
1099 See also `string-to-multibyte'.
1101 Beware, this often doesn't really do what you think it does.
1102 It is similar to (decode-coding-string STRING 'utf-8-emacs).
1103 If you're not sure, whether to use `string-as-multibyte' or
1104 `string-to-multibyte', use `string-to-multibyte'. */)
1105 (Lisp_Object string
)
1107 CHECK_STRING (string
);
1109 if (! STRING_MULTIBYTE (string
))
1111 Lisp_Object new_string
;
1112 ptrdiff_t nchars
, nbytes
;
1114 parse_str_as_multibyte (SDATA (string
),
1117 new_string
= make_uninit_multibyte_string (nchars
, nbytes
);
1118 memcpy (SDATA (new_string
), SDATA (string
), SBYTES (string
));
1119 if (nbytes
!= SBYTES (string
))
1120 str_as_multibyte (SDATA (new_string
), nbytes
,
1121 SBYTES (string
), NULL
);
1122 string
= new_string
;
1123 set_string_intervals (string
, NULL
);
1128 DEFUN ("string-to-multibyte", Fstring_to_multibyte
, Sstring_to_multibyte
,
1130 doc
: /* Return a multibyte string with the same individual chars as STRING.
1131 If STRING is multibyte, the result is STRING itself.
1132 Otherwise it is a newly created string, with no text properties.
1134 If STRING is unibyte and contains an 8-bit byte, it is converted to
1135 the corresponding multibyte character of charset `eight-bit'.
1137 This differs from `string-as-multibyte' by converting each byte of a correct
1138 utf-8 sequence to an eight-bit character, not just bytes that don't form a
1139 correct sequence. */)
1140 (Lisp_Object string
)
1142 CHECK_STRING (string
);
1144 return string_to_multibyte (string
);
1147 DEFUN ("string-to-unibyte", Fstring_to_unibyte
, Sstring_to_unibyte
,
1149 doc
: /* Return a unibyte string with the same individual chars as STRING.
1150 If STRING is unibyte, the result is STRING itself.
1151 Otherwise it is a newly created string, with no text properties,
1152 where each `eight-bit' character is converted to the corresponding byte.
1153 If STRING contains a non-ASCII, non-`eight-bit' character,
1154 an error is signaled. */)
1155 (Lisp_Object string
)
1157 CHECK_STRING (string
);
1159 if (STRING_MULTIBYTE (string
))
1161 ptrdiff_t chars
= SCHARS (string
);
1162 unsigned char *str
= xmalloc (chars
);
1163 ptrdiff_t converted
= str_to_unibyte (SDATA (string
), str
, chars
);
1165 if (converted
< chars
)
1166 error ("Can't convert the %"pD
"dth character to unibyte", converted
);
1167 string
= make_unibyte_string ((char *) str
, chars
);
1174 DEFUN ("copy-alist", Fcopy_alist
, Scopy_alist
, 1, 1, 0,
1175 doc
: /* Return a copy of ALIST.
1176 This is an alist which represents the same mapping from objects to objects,
1177 but does not share the alist structure with ALIST.
1178 The objects mapped (cars and cdrs of elements of the alist)
1179 are shared, however.
1180 Elements of ALIST that are not conses are also shared. */)
1183 register Lisp_Object tem
;
1188 alist
= concat (1, &alist
, Lisp_Cons
, 0);
1189 for (tem
= alist
; CONSP (tem
); tem
= XCDR (tem
))
1191 register Lisp_Object car
;
1195 XSETCAR (tem
, Fcons (XCAR (car
), XCDR (car
)));
1200 /* Check that ARRAY can have a valid subarray [FROM..TO),
1201 given that its size is SIZE.
1202 If FROM is nil, use 0; if TO is nil, use SIZE.
1203 Count negative values backwards from the end.
1204 Set *IFROM and *ITO to the two indexes used. */
1207 validate_subarray (Lisp_Object array
, Lisp_Object from
, Lisp_Object to
,
1208 ptrdiff_t size
, ptrdiff_t *ifrom
, ptrdiff_t *ito
)
1212 if (INTEGERP (from
))
1218 else if (NILP (from
))
1221 wrong_type_argument (Qintegerp
, from
);
1232 wrong_type_argument (Qintegerp
, to
);
1234 if (! (0 <= f
&& f
<= t
&& t
<= size
))
1235 args_out_of_range_3 (array
, from
, to
);
1241 DEFUN ("substring", Fsubstring
, Ssubstring
, 1, 3, 0,
1242 doc
: /* Return a new string whose contents are a substring of STRING.
1243 The returned string consists of the characters between index FROM
1244 \(inclusive) and index TO (exclusive) of STRING. FROM and TO are
1245 zero-indexed: 0 means the first character of STRING. Negative values
1246 are counted from the end of STRING. If TO is nil, the substring runs
1247 to the end of STRING.
1249 The STRING argument may also be a vector. In that case, the return
1250 value is a new vector that contains the elements between index FROM
1251 \(inclusive) and index TO (exclusive) of that vector argument.
1253 With one argument, just copy STRING (with properties, if any). */)
1254 (Lisp_Object string
, Lisp_Object from
, Lisp_Object to
)
1257 ptrdiff_t size
, ifrom
, ito
;
1259 size
= CHECK_VECTOR_OR_STRING (string
);
1260 validate_subarray (string
, from
, to
, size
, &ifrom
, &ito
);
1262 if (STRINGP (string
))
1265 = !ifrom
? 0 : string_char_to_byte (string
, ifrom
);
1267 = ito
== size
? SBYTES (string
) : string_char_to_byte (string
, ito
);
1268 res
= make_specified_string (SSDATA (string
) + from_byte
,
1269 ito
- ifrom
, to_byte
- from_byte
,
1270 STRING_MULTIBYTE (string
));
1271 copy_text_properties (make_number (ifrom
), make_number (ito
),
1272 string
, make_number (0), res
, Qnil
);
1275 res
= Fvector (ito
- ifrom
, aref_addr (string
, ifrom
));
1281 DEFUN ("substring-no-properties", Fsubstring_no_properties
, Ssubstring_no_properties
, 1, 3, 0,
1282 doc
: /* Return a substring of STRING, without text properties.
1283 It starts at index FROM and ends before TO.
1284 TO may be nil or omitted; then the substring runs to the end of STRING.
1285 If FROM is nil or omitted, the substring starts at the beginning of STRING.
1286 If FROM or TO is negative, it counts from the end.
1288 With one argument, just copy STRING without its properties. */)
1289 (Lisp_Object string
, register Lisp_Object from
, Lisp_Object to
)
1291 ptrdiff_t from_char
, to_char
, from_byte
, to_byte
, size
;
1293 CHECK_STRING (string
);
1295 size
= SCHARS (string
);
1296 validate_subarray (string
, from
, to
, size
, &from_char
, &to_char
);
1298 from_byte
= !from_char
? 0 : string_char_to_byte (string
, from_char
);
1300 to_char
== size
? SBYTES (string
) : string_char_to_byte (string
, to_char
);
1301 return make_specified_string (SSDATA (string
) + from_byte
,
1302 to_char
- from_char
, to_byte
- from_byte
,
1303 STRING_MULTIBYTE (string
));
1306 /* Extract a substring of STRING, giving start and end positions
1307 both in characters and in bytes. */
1310 substring_both (Lisp_Object string
, ptrdiff_t from
, ptrdiff_t from_byte
,
1311 ptrdiff_t to
, ptrdiff_t to_byte
)
1314 ptrdiff_t size
= CHECK_VECTOR_OR_STRING (string
);
1316 if (!(0 <= from
&& from
<= to
&& to
<= size
))
1317 args_out_of_range_3 (string
, make_number (from
), make_number (to
));
1319 if (STRINGP (string
))
1321 res
= make_specified_string (SSDATA (string
) + from_byte
,
1322 to
- from
, to_byte
- from_byte
,
1323 STRING_MULTIBYTE (string
));
1324 copy_text_properties (make_number (from
), make_number (to
),
1325 string
, make_number (0), res
, Qnil
);
1328 res
= Fvector (to
- from
, aref_addr (string
, from
));
1333 DEFUN ("nthcdr", Fnthcdr
, Snthcdr
, 2, 2, 0,
1334 doc
: /* Take cdr N times on LIST, return the result. */)
1335 (Lisp_Object n
, Lisp_Object list
)
1340 for (i
= 0; i
< num
&& !NILP (list
); i
++)
1343 CHECK_LIST_CONS (list
, list
);
1349 DEFUN ("nth", Fnth
, Snth
, 2, 2, 0,
1350 doc
: /* Return the Nth element of LIST.
1351 N counts from zero. If LIST is not that long, nil is returned. */)
1352 (Lisp_Object n
, Lisp_Object list
)
1354 return Fcar (Fnthcdr (n
, list
));
1357 DEFUN ("elt", Felt
, Selt
, 2, 2, 0,
1358 doc
: /* Return element of SEQUENCE at index N. */)
1359 (register Lisp_Object sequence
, Lisp_Object n
)
1362 if (CONSP (sequence
) || NILP (sequence
))
1363 return Fcar (Fnthcdr (n
, sequence
));
1365 /* Faref signals a "not array" error, so check here. */
1366 CHECK_ARRAY (sequence
, Qsequencep
);
1367 return Faref (sequence
, n
);
1370 DEFUN ("member", Fmember
, Smember
, 2, 2, 0,
1371 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'.
1372 The value is actually the tail of LIST whose car is ELT. */)
1373 (register Lisp_Object elt
, Lisp_Object list
)
1375 register Lisp_Object tail
;
1376 for (tail
= list
; CONSP (tail
); tail
= XCDR (tail
))
1378 register Lisp_Object tem
;
1379 CHECK_LIST_CONS (tail
, list
);
1381 if (! NILP (Fequal (elt
, tem
)))
1388 DEFUN ("memq", Fmemq
, Smemq
, 2, 2, 0,
1389 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `eq'.
1390 The value is actually the tail of LIST whose car is ELT. */)
1391 (register Lisp_Object elt
, Lisp_Object list
)
1395 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1399 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1403 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1414 DEFUN ("memql", Fmemql
, Smemql
, 2, 2, 0,
1415 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `eql'.
1416 The value is actually the tail of LIST whose car is ELT. */)
1417 (register Lisp_Object elt
, Lisp_Object list
)
1419 register Lisp_Object tail
;
1422 return Fmemq (elt
, list
);
1424 for (tail
= list
; CONSP (tail
); tail
= XCDR (tail
))
1426 register Lisp_Object tem
;
1427 CHECK_LIST_CONS (tail
, list
);
1429 if (FLOATP (tem
) && internal_equal (elt
, tem
, 0, 0, Qnil
))
1436 DEFUN ("assq", Fassq
, Sassq
, 2, 2, 0,
1437 doc
: /* Return non-nil if KEY is `eq' to the car of an element of LIST.
1438 The value is actually the first element of LIST whose car is KEY.
1439 Elements of LIST that are not conses are ignored. */)
1440 (Lisp_Object key
, Lisp_Object list
)
1445 || (CONSP (XCAR (list
))
1446 && EQ (XCAR (XCAR (list
)), key
)))
1451 || (CONSP (XCAR (list
))
1452 && EQ (XCAR (XCAR (list
)), key
)))
1457 || (CONSP (XCAR (list
))
1458 && EQ (XCAR (XCAR (list
)), key
)))
1468 /* Like Fassq but never report an error and do not allow quits.
1469 Use only on lists known never to be circular. */
1472 assq_no_quit (Lisp_Object key
, Lisp_Object list
)
1475 && (!CONSP (XCAR (list
))
1476 || !EQ (XCAR (XCAR (list
)), key
)))
1479 return CAR_SAFE (list
);
1482 DEFUN ("assoc", Fassoc
, Sassoc
, 2, 2, 0,
1483 doc
: /* Return non-nil if KEY is `equal' to the car of an element of LIST.
1484 The value is actually the first element of LIST whose car equals KEY. */)
1485 (Lisp_Object key
, Lisp_Object list
)
1492 || (CONSP (XCAR (list
))
1493 && (car
= XCAR (XCAR (list
)),
1494 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1499 || (CONSP (XCAR (list
))
1500 && (car
= XCAR (XCAR (list
)),
1501 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1506 || (CONSP (XCAR (list
))
1507 && (car
= XCAR (XCAR (list
)),
1508 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1518 /* Like Fassoc but never report an error and do not allow quits.
1519 Use only on lists known never to be circular. */
1522 assoc_no_quit (Lisp_Object key
, Lisp_Object list
)
1525 && (!CONSP (XCAR (list
))
1526 || (!EQ (XCAR (XCAR (list
)), key
)
1527 && NILP (Fequal (XCAR (XCAR (list
)), key
)))))
1530 return CONSP (list
) ? XCAR (list
) : Qnil
;
1533 DEFUN ("rassq", Frassq
, Srassq
, 2, 2, 0,
1534 doc
: /* Return non-nil if KEY is `eq' to the cdr of an element of LIST.
1535 The value is actually the first element of LIST whose cdr is KEY. */)
1536 (register Lisp_Object key
, Lisp_Object list
)
1541 || (CONSP (XCAR (list
))
1542 && EQ (XCDR (XCAR (list
)), key
)))
1547 || (CONSP (XCAR (list
))
1548 && EQ (XCDR (XCAR (list
)), key
)))
1553 || (CONSP (XCAR (list
))
1554 && EQ (XCDR (XCAR (list
)), key
)))
1564 DEFUN ("rassoc", Frassoc
, Srassoc
, 2, 2, 0,
1565 doc
: /* Return non-nil if KEY is `equal' to the cdr of an element of LIST.
1566 The value is actually the first element of LIST whose cdr equals KEY. */)
1567 (Lisp_Object key
, Lisp_Object list
)
1574 || (CONSP (XCAR (list
))
1575 && (cdr
= XCDR (XCAR (list
)),
1576 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1581 || (CONSP (XCAR (list
))
1582 && (cdr
= XCDR (XCAR (list
)),
1583 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1588 || (CONSP (XCAR (list
))
1589 && (cdr
= XCDR (XCAR (list
)),
1590 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1600 DEFUN ("delq", Fdelq
, Sdelq
, 2, 2, 0,
1601 doc
: /* Delete members of LIST which are `eq' to ELT, and return the result.
1602 More precisely, this function skips any members `eq' to ELT at the
1603 front of LIST, then removes members `eq' to ELT from the remaining
1604 sublist by modifying its list structure, then returns the resulting
1607 Write `(setq foo (delq element foo))' to be sure of correctly changing
1608 the value of a list `foo'. */)
1609 (register Lisp_Object elt
, Lisp_Object list
)
1611 Lisp_Object tail
, tortoise
, prev
= Qnil
;
1614 FOR_EACH_TAIL (tail
, list
, tortoise
, skip
)
1616 Lisp_Object tem
= XCAR (tail
);
1622 Fsetcdr (prev
, XCDR (tail
));
1630 DEFUN ("delete", Fdelete
, Sdelete
, 2, 2, 0,
1631 doc
: /* Delete members of SEQ which are `equal' to ELT, and return the result.
1632 SEQ must be a sequence (i.e. a list, a vector, or a string).
1633 The return value is a sequence of the same type.
1635 If SEQ is a list, this behaves like `delq', except that it compares
1636 with `equal' instead of `eq'. In particular, it may remove elements
1637 by altering the list structure.
1639 If SEQ is not a list, deletion is never performed destructively;
1640 instead this function creates and returns a new vector or string.
1642 Write `(setq foo (delete element foo))' to be sure of correctly
1643 changing the value of a sequence `foo'. */)
1644 (Lisp_Object elt
, Lisp_Object seq
)
1650 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1651 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1654 if (n
!= ASIZE (seq
))
1656 struct Lisp_Vector
*p
= allocate_vector (n
);
1658 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1659 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1660 p
->contents
[n
++] = AREF (seq
, i
);
1662 XSETVECTOR (seq
, p
);
1665 else if (STRINGP (seq
))
1667 ptrdiff_t i
, ibyte
, nchars
, nbytes
, cbytes
;
1670 for (i
= nchars
= nbytes
= ibyte
= 0;
1672 ++i
, ibyte
+= cbytes
)
1674 if (STRING_MULTIBYTE (seq
))
1676 c
= STRING_CHAR (SDATA (seq
) + ibyte
);
1677 cbytes
= CHAR_BYTES (c
);
1685 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1692 if (nchars
!= SCHARS (seq
))
1696 tem
= make_uninit_multibyte_string (nchars
, nbytes
);
1697 if (!STRING_MULTIBYTE (seq
))
1698 STRING_SET_UNIBYTE (tem
);
1700 for (i
= nchars
= nbytes
= ibyte
= 0;
1702 ++i
, ibyte
+= cbytes
)
1704 if (STRING_MULTIBYTE (seq
))
1706 c
= STRING_CHAR (SDATA (seq
) + ibyte
);
1707 cbytes
= CHAR_BYTES (c
);
1715 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1717 unsigned char *from
= SDATA (seq
) + ibyte
;
1718 unsigned char *to
= SDATA (tem
) + nbytes
;
1724 for (n
= cbytes
; n
--; )
1734 Lisp_Object tail
, prev
;
1736 for (tail
= seq
, prev
= Qnil
; CONSP (tail
); tail
= XCDR (tail
))
1738 CHECK_LIST_CONS (tail
, seq
);
1740 if (!NILP (Fequal (elt
, XCAR (tail
))))
1745 Fsetcdr (prev
, XCDR (tail
));
1756 DEFUN ("nreverse", Fnreverse
, Snreverse
, 1, 1, 0,
1757 doc
: /* Reverse order of items in a list, vector or string SEQ.
1758 If SEQ is a list, it should be nil-terminated.
1759 This function may destructively modify SEQ to produce the value. */)
1764 else if (STRINGP (seq
))
1765 return Freverse (seq
);
1766 else if (CONSP (seq
))
1768 Lisp_Object prev
, tail
, next
;
1770 for (prev
= Qnil
, tail
= seq
; !NILP (tail
); tail
= next
)
1773 CHECK_LIST_CONS (tail
, tail
);
1775 Fsetcdr (tail
, prev
);
1780 else if (VECTORP (seq
))
1782 ptrdiff_t i
, size
= ASIZE (seq
);
1784 for (i
= 0; i
< size
/ 2; i
++)
1786 Lisp_Object tem
= AREF (seq
, i
);
1787 ASET (seq
, i
, AREF (seq
, size
- i
- 1));
1788 ASET (seq
, size
- i
- 1, tem
);
1791 else if (BOOL_VECTOR_P (seq
))
1793 ptrdiff_t i
, size
= bool_vector_size (seq
);
1795 for (i
= 0; i
< size
/ 2; i
++)
1797 bool tem
= bool_vector_bitref (seq
, i
);
1798 bool_vector_set (seq
, i
, bool_vector_bitref (seq
, size
- i
- 1));
1799 bool_vector_set (seq
, size
- i
- 1, tem
);
1803 wrong_type_argument (Qarrayp
, seq
);
1807 DEFUN ("reverse", Freverse
, Sreverse
, 1, 1, 0,
1808 doc
: /* Return the reversed copy of list, vector, or string SEQ.
1809 See also the function `nreverse', which is used more often. */)
1816 else if (CONSP (seq
))
1818 for (new = Qnil
; CONSP (seq
); seq
= XCDR (seq
))
1821 new = Fcons (XCAR (seq
), new);
1823 CHECK_LIST_END (seq
, seq
);
1825 else if (VECTORP (seq
))
1827 ptrdiff_t i
, size
= ASIZE (seq
);
1829 new = make_uninit_vector (size
);
1830 for (i
= 0; i
< size
; i
++)
1831 ASET (new, i
, AREF (seq
, size
- i
- 1));
1833 else if (BOOL_VECTOR_P (seq
))
1836 EMACS_INT nbits
= bool_vector_size (seq
);
1838 new = make_uninit_bool_vector (nbits
);
1839 for (i
= 0; i
< nbits
; i
++)
1840 bool_vector_set (new, i
, bool_vector_bitref (seq
, nbits
- i
- 1));
1842 else if (STRINGP (seq
))
1844 ptrdiff_t size
= SCHARS (seq
), bytes
= SBYTES (seq
);
1850 new = make_uninit_string (size
);
1851 for (i
= 0; i
< size
; i
++)
1852 SSET (new, i
, SREF (seq
, size
- i
- 1));
1856 unsigned char *p
, *q
;
1858 new = make_uninit_multibyte_string (size
, bytes
);
1859 p
= SDATA (seq
), q
= SDATA (new) + bytes
;
1860 while (q
> SDATA (new))
1864 ch
= STRING_CHAR_AND_LENGTH (p
, len
);
1866 CHAR_STRING (ch
, q
);
1871 wrong_type_argument (Qsequencep
, seq
);
1875 /* Sort LIST using PREDICATE, preserving original order of elements
1876 considered as equal. */
1879 sort_list (Lisp_Object list
, Lisp_Object predicate
)
1881 Lisp_Object front
, back
;
1882 register Lisp_Object len
, tem
;
1883 struct gcpro gcpro1
, gcpro2
;
1887 len
= Flength (list
);
1888 length
= XINT (len
);
1892 XSETINT (len
, (length
/ 2) - 1);
1893 tem
= Fnthcdr (len
, list
);
1895 Fsetcdr (tem
, Qnil
);
1897 GCPRO2 (front
, back
);
1898 front
= Fsort (front
, predicate
);
1899 back
= Fsort (back
, predicate
);
1901 return merge (front
, back
, predicate
);
1904 /* Using PRED to compare, return whether A and B are in order.
1905 Compare stably when A appeared before B in the input. */
1907 inorder (Lisp_Object pred
, Lisp_Object a
, Lisp_Object b
)
1909 return NILP (call2 (pred
, b
, a
));
1912 /* Using PRED to compare, merge from ALEN-length A and BLEN-length B
1913 into DEST. Argument arrays must be nonempty and must not overlap,
1914 except that B might be the last part of DEST. */
1916 merge_vectors (Lisp_Object pred
,
1917 ptrdiff_t alen
, Lisp_Object
const a
[restrict
VLA_ELEMS (alen
)],
1918 ptrdiff_t blen
, Lisp_Object
const b
[VLA_ELEMS (blen
)],
1919 Lisp_Object dest
[VLA_ELEMS (alen
+ blen
)])
1921 eassume (0 < alen
&& 0 < blen
);
1922 Lisp_Object
const *alim
= a
+ alen
;
1923 Lisp_Object
const *blim
= b
+ blen
;
1927 if (inorder (pred
, a
[0], b
[0]))
1933 memcpy (dest
, b
, (blim
- b
) * sizeof *dest
);
1942 memcpy (dest
, a
, (alim
- a
) * sizeof *dest
);
1949 /* Using PRED to compare, sort LEN-length VEC in place, using TMP for
1950 temporary storage. LEN must be at least 2. */
1952 sort_vector_inplace (Lisp_Object pred
, ptrdiff_t len
,
1953 Lisp_Object vec
[restrict
VLA_ELEMS (len
)],
1954 Lisp_Object tmp
[restrict
VLA_ELEMS (len
>> 1)])
1957 ptrdiff_t halflen
= len
>> 1;
1958 sort_vector_copy (pred
, halflen
, vec
, tmp
);
1959 if (1 < len
- halflen
)
1960 sort_vector_inplace (pred
, len
- halflen
, vec
+ halflen
, vec
);
1961 merge_vectors (pred
, halflen
, tmp
, len
- halflen
, vec
+ halflen
, vec
);
1964 /* Using PRED to compare, sort from LEN-length SRC into DST.
1965 Len must be positive. */
1967 sort_vector_copy (Lisp_Object pred
, ptrdiff_t len
,
1968 Lisp_Object src
[restrict
VLA_ELEMS (len
)],
1969 Lisp_Object dest
[restrict
VLA_ELEMS (len
)])
1972 ptrdiff_t halflen
= len
>> 1;
1978 sort_vector_inplace (pred
, halflen
, src
, dest
);
1979 if (1 < len
- halflen
)
1980 sort_vector_inplace (pred
, len
- halflen
, src
+ halflen
, dest
);
1981 merge_vectors (pred
, halflen
, src
, len
- halflen
, src
+ halflen
, dest
);
1985 /* Sort VECTOR in place using PREDICATE, preserving original order of
1986 elements considered as equal. */
1989 sort_vector (Lisp_Object vector
, Lisp_Object predicate
)
1991 ptrdiff_t len
= ASIZE (vector
);
1994 ptrdiff_t halflen
= len
>> 1;
1996 struct gcpro gcpro1
, gcpro2
;
1997 GCPRO2 (vector
, predicate
);
1999 SAFE_ALLOCA_LISP (tmp
, halflen
);
2000 for (ptrdiff_t i
= 0; i
< halflen
; i
++)
2001 tmp
[i
] = make_number (0);
2002 sort_vector_inplace (predicate
, len
, XVECTOR (vector
)->contents
, tmp
);
2007 DEFUN ("sort", Fsort
, Ssort
, 2, 2, 0,
2008 doc
: /* Sort SEQ, stably, comparing elements using PREDICATE.
2009 Returns the sorted sequence. SEQ should be a list or vector. SEQ is
2010 modified by side effects. PREDICATE is called with two elements of
2011 SEQ, and should return non-nil if the first element should sort before
2013 (Lisp_Object seq
, Lisp_Object predicate
)
2016 seq
= sort_list (seq
, predicate
);
2017 else if (VECTORP (seq
))
2018 sort_vector (seq
, predicate
);
2019 else if (!NILP (seq
))
2020 wrong_type_argument (Qsequencep
, seq
);
2025 merge (Lisp_Object org_l1
, Lisp_Object org_l2
, Lisp_Object pred
)
2028 register Lisp_Object tail
;
2030 register Lisp_Object l1
, l2
;
2031 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
2038 /* It is sufficient to protect org_l1 and org_l2.
2039 When l1 and l2 are updated, we copy the new values
2040 back into the org_ vars. */
2041 GCPRO4 (org_l1
, org_l2
, pred
, value
);
2061 if (inorder (pred
, Fcar (l1
), Fcar (l2
)))
2076 Fsetcdr (tail
, tem
);
2082 /* This does not check for quits. That is safe since it must terminate. */
2084 DEFUN ("plist-get", Fplist_get
, Splist_get
, 2, 2, 0,
2085 doc
: /* Extract a value from a property list.
2086 PLIST is a property list, which is a list of the form
2087 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2088 corresponding to the given PROP, or nil if PROP is not one of the
2089 properties on the list. This function never signals an error. */)
2090 (Lisp_Object plist
, Lisp_Object prop
)
2092 Lisp_Object tail
, halftail
;
2094 /* halftail is used to detect circular lists. */
2095 tail
= halftail
= plist
;
2096 while (CONSP (tail
) && CONSP (XCDR (tail
)))
2098 if (EQ (prop
, XCAR (tail
)))
2099 return XCAR (XCDR (tail
));
2101 tail
= XCDR (XCDR (tail
));
2102 halftail
= XCDR (halftail
);
2103 if (EQ (tail
, halftail
))
2110 DEFUN ("get", Fget
, Sget
, 2, 2, 0,
2111 doc
: /* Return the value of SYMBOL's PROPNAME property.
2112 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'. */)
2113 (Lisp_Object symbol
, Lisp_Object propname
)
2115 CHECK_SYMBOL (symbol
);
2116 return Fplist_get (XSYMBOL (symbol
)->plist
, propname
);
2119 DEFUN ("plist-put", Fplist_put
, Splist_put
, 3, 3, 0,
2120 doc
: /* Change value in PLIST of PROP to VAL.
2121 PLIST is a property list, which is a list of the form
2122 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.
2123 If PROP is already a property on the list, its value is set to VAL,
2124 otherwise the new PROP VAL pair is added. The new plist is returned;
2125 use `(setq x (plist-put x prop val))' to be sure to use the new value.
2126 The PLIST is modified by side effects. */)
2127 (Lisp_Object plist
, register Lisp_Object prop
, Lisp_Object val
)
2129 register Lisp_Object tail
, prev
;
2130 Lisp_Object newcell
;
2132 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
2133 tail
= XCDR (XCDR (tail
)))
2135 if (EQ (prop
, XCAR (tail
)))
2137 Fsetcar (XCDR (tail
), val
);
2144 newcell
= Fcons (prop
, Fcons (val
, NILP (prev
) ? plist
: XCDR (XCDR (prev
))));
2148 Fsetcdr (XCDR (prev
), newcell
);
2152 DEFUN ("put", Fput
, Sput
, 3, 3, 0,
2153 doc
: /* Store SYMBOL's PROPNAME property with value VALUE.
2154 It can be retrieved with `(get SYMBOL PROPNAME)'. */)
2155 (Lisp_Object symbol
, Lisp_Object propname
, Lisp_Object value
)
2157 CHECK_SYMBOL (symbol
);
2159 (symbol
, Fplist_put (XSYMBOL (symbol
)->plist
, propname
, value
));
2163 DEFUN ("lax-plist-get", Flax_plist_get
, Slax_plist_get
, 2, 2, 0,
2164 doc
: /* Extract a value from a property list, comparing with `equal'.
2165 PLIST is a property list, which is a list of the form
2166 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2167 corresponding to the given PROP, or nil if PROP is not
2168 one of the properties on the list. */)
2169 (Lisp_Object plist
, Lisp_Object prop
)
2174 CONSP (tail
) && CONSP (XCDR (tail
));
2175 tail
= XCDR (XCDR (tail
)))
2177 if (! NILP (Fequal (prop
, XCAR (tail
))))
2178 return XCAR (XCDR (tail
));
2183 CHECK_LIST_END (tail
, prop
);
2188 DEFUN ("lax-plist-put", Flax_plist_put
, Slax_plist_put
, 3, 3, 0,
2189 doc
: /* Change value in PLIST of PROP to VAL, comparing with `equal'.
2190 PLIST is a property list, which is a list of the form
2191 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP and VAL are any objects.
2192 If PROP is already a property on the list, its value is set to VAL,
2193 otherwise the new PROP VAL pair is added. The new plist is returned;
2194 use `(setq x (lax-plist-put x prop val))' to be sure to use the new value.
2195 The PLIST is modified by side effects. */)
2196 (Lisp_Object plist
, register Lisp_Object prop
, Lisp_Object val
)
2198 register Lisp_Object tail
, prev
;
2199 Lisp_Object newcell
;
2201 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
2202 tail
= XCDR (XCDR (tail
)))
2204 if (! NILP (Fequal (prop
, XCAR (tail
))))
2206 Fsetcar (XCDR (tail
), val
);
2213 newcell
= list2 (prop
, val
);
2217 Fsetcdr (XCDR (prev
), newcell
);
2221 DEFUN ("eql", Feql
, Seql
, 2, 2, 0,
2222 doc
: /* Return t if the two args are the same Lisp object.
2223 Floating-point numbers of equal value are `eql', but they may not be `eq'. */)
2224 (Lisp_Object obj1
, Lisp_Object obj2
)
2227 return internal_equal (obj1
, obj2
, 0, 0, Qnil
) ? Qt
: Qnil
;
2229 return EQ (obj1
, obj2
) ? Qt
: Qnil
;
2232 DEFUN ("equal", Fequal
, Sequal
, 2, 2, 0,
2233 doc
: /* Return t if two Lisp objects have similar structure and contents.
2234 They must have the same data type.
2235 Conses are compared by comparing the cars and the cdrs.
2236 Vectors and strings are compared element by element.
2237 Numbers are compared by value, but integers cannot equal floats.
2238 (Use `=' if you want integers and floats to be able to be equal.)
2239 Symbols must match exactly. */)
2240 (register Lisp_Object o1
, Lisp_Object o2
)
2242 return internal_equal (o1
, o2
, 0, 0, Qnil
) ? Qt
: Qnil
;
2245 DEFUN ("equal-including-properties", Fequal_including_properties
, Sequal_including_properties
, 2, 2, 0,
2246 doc
: /* Return t if two Lisp objects have similar structure and contents.
2247 This is like `equal' except that it compares the text properties
2248 of strings. (`equal' ignores text properties.) */)
2249 (register Lisp_Object o1
, Lisp_Object o2
)
2251 return internal_equal (o1
, o2
, 0, 1, Qnil
) ? Qt
: Qnil
;
2254 /* DEPTH is current depth of recursion. Signal an error if it
2256 PROPS means compare string text properties too. */
2259 internal_equal (Lisp_Object o1
, Lisp_Object o2
, int depth
, bool props
,
2265 error ("Stack overflow in equal");
2268 Lisp_Object args
[2];
2271 ht
= Fmake_hash_table (2, args
);
2275 case Lisp_Cons
: case Lisp_Misc
: case Lisp_Vectorlike
:
2277 struct Lisp_Hash_Table
*h
= XHASH_TABLE (ht
);
2279 ptrdiff_t i
= hash_lookup (h
, o1
, &hash
);
2281 { /* `o1' was seen already. */
2282 Lisp_Object o2s
= HASH_VALUE (h
, i
);
2283 if (!NILP (Fmemq (o2
, o2s
)))
2286 set_hash_value_slot (h
, i
, Fcons (o2
, o2s
));
2289 hash_put (h
, o1
, Fcons (o2
, Qnil
), hash
);
2299 if (XTYPE (o1
) != XTYPE (o2
))
2308 d1
= extract_float (o1
);
2309 d2
= extract_float (o2
);
2310 /* If d is a NaN, then d != d. Two NaNs should be `equal' even
2311 though they are not =. */
2312 return d1
== d2
|| (d1
!= d1
&& d2
!= d2
);
2316 if (!internal_equal (XCAR (o1
), XCAR (o2
), depth
+ 1, props
, ht
))
2320 /* FIXME: This inf-loops in a circular list! */
2324 if (XMISCTYPE (o1
) != XMISCTYPE (o2
))
2328 if (!internal_equal (OVERLAY_START (o1
), OVERLAY_START (o2
),
2329 depth
+ 1, props
, ht
)
2330 || !internal_equal (OVERLAY_END (o1
), OVERLAY_END (o2
),
2331 depth
+ 1, props
, ht
))
2333 o1
= XOVERLAY (o1
)->plist
;
2334 o2
= XOVERLAY (o2
)->plist
;
2339 return (XMARKER (o1
)->buffer
== XMARKER (o2
)->buffer
2340 && (XMARKER (o1
)->buffer
== 0
2341 || XMARKER (o1
)->bytepos
== XMARKER (o2
)->bytepos
));
2345 case Lisp_Vectorlike
:
2348 ptrdiff_t size
= ASIZE (o1
);
2349 /* Pseudovectors have the type encoded in the size field, so this test
2350 actually checks that the objects have the same type as well as the
2352 if (ASIZE (o2
) != size
)
2354 /* Boolvectors are compared much like strings. */
2355 if (BOOL_VECTOR_P (o1
))
2357 EMACS_INT size
= bool_vector_size (o1
);
2358 if (size
!= bool_vector_size (o2
))
2360 if (memcmp (bool_vector_data (o1
), bool_vector_data (o2
),
2361 bool_vector_bytes (size
)))
2365 if (WINDOW_CONFIGURATIONP (o1
))
2366 return compare_window_configurations (o1
, o2
, 0);
2368 /* Aside from them, only true vectors, char-tables, compiled
2369 functions, and fonts (font-spec, font-entity, font-object)
2370 are sensible to compare, so eliminate the others now. */
2371 if (size
& PSEUDOVECTOR_FLAG
)
2373 if (((size
& PVEC_TYPE_MASK
) >> PSEUDOVECTOR_AREA_BITS
)
2376 size
&= PSEUDOVECTOR_SIZE_MASK
;
2378 for (i
= 0; i
< size
; i
++)
2383 if (!internal_equal (v1
, v2
, depth
+ 1, props
, ht
))
2391 if (SCHARS (o1
) != SCHARS (o2
))
2393 if (SBYTES (o1
) != SBYTES (o2
))
2395 if (memcmp (SDATA (o1
), SDATA (o2
), SBYTES (o1
)))
2397 if (props
&& !compare_string_intervals (o1
, o2
))
2409 DEFUN ("fillarray", Ffillarray
, Sfillarray
, 2, 2, 0,
2410 doc
: /* Store each element of ARRAY with ITEM.
2411 ARRAY is a vector, string, char-table, or bool-vector. */)
2412 (Lisp_Object array
, Lisp_Object item
)
2414 register ptrdiff_t size
, idx
;
2416 if (VECTORP (array
))
2417 for (idx
= 0, size
= ASIZE (array
); idx
< size
; idx
++)
2418 ASET (array
, idx
, item
);
2419 else if (CHAR_TABLE_P (array
))
2423 for (i
= 0; i
< (1 << CHARTAB_SIZE_BITS_0
); i
++)
2424 set_char_table_contents (array
, i
, item
);
2425 set_char_table_defalt (array
, item
);
2427 else if (STRINGP (array
))
2429 register unsigned char *p
= SDATA (array
);
2431 CHECK_CHARACTER (item
);
2432 charval
= XFASTINT (item
);
2433 size
= SCHARS (array
);
2434 if (STRING_MULTIBYTE (array
))
2436 unsigned char str
[MAX_MULTIBYTE_LENGTH
];
2437 int len
= CHAR_STRING (charval
, str
);
2438 ptrdiff_t size_byte
= SBYTES (array
);
2440 if (INT_MULTIPLY_OVERFLOW (SCHARS (array
), len
)
2441 || SCHARS (array
) * len
!= size_byte
)
2442 error ("Attempt to change byte length of a string");
2443 for (idx
= 0; idx
< size_byte
; idx
++)
2444 *p
++ = str
[idx
% len
];
2447 for (idx
= 0; idx
< size
; idx
++)
2450 else if (BOOL_VECTOR_P (array
))
2451 return bool_vector_fill (array
, item
);
2453 wrong_type_argument (Qarrayp
, array
);
2457 DEFUN ("clear-string", Fclear_string
, Sclear_string
,
2459 doc
: /* Clear the contents of STRING.
2460 This makes STRING unibyte and may change its length. */)
2461 (Lisp_Object string
)
2464 CHECK_STRING (string
);
2465 len
= SBYTES (string
);
2466 memset (SDATA (string
), 0, len
);
2467 STRING_SET_CHARS (string
, len
);
2468 STRING_SET_UNIBYTE (string
);
2474 nconc2 (Lisp_Object s1
, Lisp_Object s2
)
2476 Lisp_Object args
[2];
2479 return Fnconc (2, args
);
2482 DEFUN ("nconc", Fnconc
, Snconc
, 0, MANY
, 0,
2483 doc
: /* Concatenate any number of lists by altering them.
2484 Only the last argument is not altered, and need not be a list.
2485 usage: (nconc &rest LISTS) */)
2486 (ptrdiff_t nargs
, Lisp_Object
*args
)
2489 register Lisp_Object tail
, tem
, val
;
2493 for (argnum
= 0; argnum
< nargs
; argnum
++)
2496 if (NILP (tem
)) continue;
2501 if (argnum
+ 1 == nargs
) break;
2503 CHECK_LIST_CONS (tem
, tem
);
2512 tem
= args
[argnum
+ 1];
2513 Fsetcdr (tail
, tem
);
2515 args
[argnum
+ 1] = tail
;
2521 /* This is the guts of all mapping functions.
2522 Apply FN to each element of SEQ, one by one,
2523 storing the results into elements of VALS, a C vector of Lisp_Objects.
2524 LENI is the length of VALS, which should also be the length of SEQ. */
2527 mapcar1 (EMACS_INT leni
, Lisp_Object
*vals
, Lisp_Object fn
, Lisp_Object seq
)
2529 register Lisp_Object tail
;
2531 register EMACS_INT i
;
2532 struct gcpro gcpro1
, gcpro2
, gcpro3
;
2536 /* Don't let vals contain any garbage when GC happens. */
2537 for (i
= 0; i
< leni
; i
++)
2540 GCPRO3 (dummy
, fn
, seq
);
2542 gcpro1
.nvars
= leni
;
2546 /* We need not explicitly protect `tail' because it is used only on lists, and
2547 1) lists are not relocated and 2) the list is marked via `seq' so will not
2550 if (VECTORP (seq
) || COMPILEDP (seq
))
2552 for (i
= 0; i
< leni
; i
++)
2554 dummy
= call1 (fn
, AREF (seq
, i
));
2559 else if (BOOL_VECTOR_P (seq
))
2561 for (i
= 0; i
< leni
; i
++)
2563 dummy
= call1 (fn
, bool_vector_ref (seq
, i
));
2568 else if (STRINGP (seq
))
2572 for (i
= 0, i_byte
= 0; i
< leni
;)
2575 ptrdiff_t i_before
= i
;
2577 FETCH_STRING_CHAR_ADVANCE (c
, seq
, i
, i_byte
);
2578 XSETFASTINT (dummy
, c
);
2579 dummy
= call1 (fn
, dummy
);
2581 vals
[i_before
] = dummy
;
2584 else /* Must be a list, since Flength did not get an error */
2587 for (i
= 0; i
< leni
&& CONSP (tail
); i
++)
2589 dummy
= call1 (fn
, XCAR (tail
));
2599 DEFUN ("mapconcat", Fmapconcat
, Smapconcat
, 3, 3, 0,
2600 doc
: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
2601 In between each pair of results, stick in SEPARATOR. Thus, " " as
2602 SEPARATOR results in spaces between the values returned by FUNCTION.
2603 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2604 (Lisp_Object function
, Lisp_Object sequence
, Lisp_Object separator
)
2607 register EMACS_INT leni
;
2610 register Lisp_Object
*args
;
2611 struct gcpro gcpro1
;
2615 len
= Flength (sequence
);
2616 if (CHAR_TABLE_P (sequence
))
2617 wrong_type_argument (Qlistp
, sequence
);
2619 nargs
= leni
+ leni
- 1;
2620 if (nargs
< 0) return empty_unibyte_string
;
2622 SAFE_ALLOCA_LISP (args
, nargs
);
2625 mapcar1 (leni
, args
, function
, sequence
);
2628 for (i
= leni
- 1; i
> 0; i
--)
2629 args
[i
+ i
] = args
[i
];
2631 for (i
= 1; i
< nargs
; i
+= 2)
2632 args
[i
] = separator
;
2634 ret
= Fconcat (nargs
, args
);
2640 DEFUN ("mapcar", Fmapcar
, Smapcar
, 2, 2, 0,
2641 doc
: /* Apply FUNCTION to each element of SEQUENCE, and make a list of the results.
2642 The result is a list just as long as SEQUENCE.
2643 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2644 (Lisp_Object function
, Lisp_Object sequence
)
2646 register Lisp_Object len
;
2647 register EMACS_INT leni
;
2648 register Lisp_Object
*args
;
2652 len
= Flength (sequence
);
2653 if (CHAR_TABLE_P (sequence
))
2654 wrong_type_argument (Qlistp
, sequence
);
2655 leni
= XFASTINT (len
);
2657 SAFE_ALLOCA_LISP (args
, leni
);
2659 mapcar1 (leni
, args
, function
, sequence
);
2661 ret
= Flist (leni
, args
);
2667 DEFUN ("mapc", Fmapc
, Smapc
, 2, 2, 0,
2668 doc
: /* Apply FUNCTION to each element of SEQUENCE for side effects only.
2669 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.
2670 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2671 (Lisp_Object function
, Lisp_Object sequence
)
2673 register EMACS_INT leni
;
2675 leni
= XFASTINT (Flength (sequence
));
2676 if (CHAR_TABLE_P (sequence
))
2677 wrong_type_argument (Qlistp
, sequence
);
2678 mapcar1 (leni
, 0, function
, sequence
);
2683 /* This is how C code calls `yes-or-no-p' and allows the user
2686 Anything that calls this function must protect from GC! */
2689 do_yes_or_no_p (Lisp_Object prompt
)
2691 return call1 (intern ("yes-or-no-p"), prompt
);
2694 /* Anything that calls this function must protect from GC! */
2696 DEFUN ("yes-or-no-p", Fyes_or_no_p
, Syes_or_no_p
, 1, 1, 0,
2697 doc
: /* Ask user a yes-or-no question.
2698 Return t if answer is yes, and nil if the answer is no.
2699 PROMPT is the string to display to ask the question. It should end in
2700 a space; `yes-or-no-p' adds \"(yes or no) \" to it.
2702 The user must confirm the answer with RET, and can edit it until it
2705 If dialog boxes are supported, a dialog box will be used
2706 if `last-nonmenu-event' is nil, and `use-dialog-box' is non-nil. */)
2707 (Lisp_Object prompt
)
2710 struct gcpro gcpro1
;
2712 CHECK_STRING (prompt
);
2714 if ((NILP (last_nonmenu_event
) || CONSP (last_nonmenu_event
))
2717 Lisp_Object pane
, menu
, obj
;
2718 redisplay_preserve_echo_area (4);
2719 pane
= list2 (Fcons (build_string ("Yes"), Qt
),
2720 Fcons (build_string ("No"), Qnil
));
2722 menu
= Fcons (prompt
, pane
);
2723 obj
= Fx_popup_dialog (Qt
, menu
, Qnil
);
2728 AUTO_STRING (yes_or_no
, "(yes or no) ");
2729 prompt
= Fconcat (2, (Lisp_Object
[]) {prompt
, yes_or_no
});
2734 ans
= Fdowncase (Fread_from_minibuffer (prompt
, Qnil
, Qnil
, Qnil
,
2735 Qyes_or_no_p_history
, Qnil
,
2737 if (SCHARS (ans
) == 3 && !strcmp (SSDATA (ans
), "yes"))
2742 if (SCHARS (ans
) == 2 && !strcmp (SSDATA (ans
), "no"))
2750 message1 ("Please answer yes or no.");
2751 Fsleep_for (make_number (2), Qnil
);
2755 DEFUN ("load-average", Fload_average
, Sload_average
, 0, 1, 0,
2756 doc
: /* Return list of 1 minute, 5 minute and 15 minute load averages.
2758 Each of the three load averages is multiplied by 100, then converted
2761 When USE-FLOATS is non-nil, floats will be used instead of integers.
2762 These floats are not multiplied by 100.
2764 If the 5-minute or 15-minute load averages are not available, return a
2765 shortened list, containing only those averages which are available.
2767 An error is thrown if the load average can't be obtained. In some
2768 cases making it work would require Emacs being installed setuid or
2769 setgid so that it can read kernel information, and that usually isn't
2771 (Lisp_Object use_floats
)
2774 int loads
= getloadavg (load_ave
, 3);
2775 Lisp_Object ret
= Qnil
;
2778 error ("load-average not implemented for this operating system");
2782 Lisp_Object load
= (NILP (use_floats
)
2783 ? make_number (100.0 * load_ave
[loads
])
2784 : make_float (load_ave
[loads
]));
2785 ret
= Fcons (load
, ret
);
2791 static Lisp_Object Qsubfeatures
;
2793 DEFUN ("featurep", Ffeaturep
, Sfeaturep
, 1, 2, 0,
2794 doc
: /* Return t if FEATURE is present in this Emacs.
2796 Use this to conditionalize execution of lisp code based on the
2797 presence or absence of Emacs or environment extensions.
2798 Use `provide' to declare that a feature is available. This function
2799 looks at the value of the variable `features'. The optional argument
2800 SUBFEATURE can be used to check a specific subfeature of FEATURE. */)
2801 (Lisp_Object feature
, Lisp_Object subfeature
)
2803 register Lisp_Object tem
;
2804 CHECK_SYMBOL (feature
);
2805 tem
= Fmemq (feature
, Vfeatures
);
2806 if (!NILP (tem
) && !NILP (subfeature
))
2807 tem
= Fmember (subfeature
, Fget (feature
, Qsubfeatures
));
2808 return (NILP (tem
)) ? Qnil
: Qt
;
2811 static Lisp_Object Qfuncall
;
2813 DEFUN ("provide", Fprovide
, Sprovide
, 1, 2, 0,
2814 doc
: /* Announce that FEATURE is a feature of the current Emacs.
2815 The optional argument SUBFEATURES should be a list of symbols listing
2816 particular subfeatures supported in this version of FEATURE. */)
2817 (Lisp_Object feature
, Lisp_Object subfeatures
)
2819 register Lisp_Object tem
;
2820 CHECK_SYMBOL (feature
);
2821 CHECK_LIST (subfeatures
);
2822 if (!NILP (Vautoload_queue
))
2823 Vautoload_queue
= Fcons (Fcons (make_number (0), Vfeatures
),
2825 tem
= Fmemq (feature
, Vfeatures
);
2827 Vfeatures
= Fcons (feature
, Vfeatures
);
2828 if (!NILP (subfeatures
))
2829 Fput (feature
, Qsubfeatures
, subfeatures
);
2830 LOADHIST_ATTACH (Fcons (Qprovide
, feature
));
2832 /* Run any load-hooks for this file. */
2833 tem
= Fassq (feature
, Vafter_load_alist
);
2835 Fmapc (Qfuncall
, XCDR (tem
));
2840 /* `require' and its subroutines. */
2842 /* List of features currently being require'd, innermost first. */
2844 static Lisp_Object require_nesting_list
;
2847 require_unwind (Lisp_Object old_value
)
2849 require_nesting_list
= old_value
;
2852 DEFUN ("require", Frequire
, Srequire
, 1, 3, 0,
2853 doc
: /* If feature FEATURE is not loaded, load it from FILENAME.
2854 If FEATURE is not a member of the list `features', then the feature
2855 is not loaded; so load the file FILENAME.
2856 If FILENAME is omitted, the printname of FEATURE is used as the file name,
2857 and `load' will try to load this name appended with the suffix `.elc' or
2858 `.el', in that order. The name without appended suffix will not be used.
2859 See `get-load-suffixes' for the complete list of suffixes.
2860 If the optional third argument NOERROR is non-nil,
2861 then return nil if the file is not found instead of signaling an error.
2862 Normally the return value is FEATURE.
2863 The normal messages at start and end of loading FILENAME are suppressed. */)
2864 (Lisp_Object feature
, Lisp_Object filename
, Lisp_Object noerror
)
2867 struct gcpro gcpro1
, gcpro2
;
2868 bool from_file
= load_in_progress
;
2870 CHECK_SYMBOL (feature
);
2872 /* Record the presence of `require' in this file
2873 even if the feature specified is already loaded.
2874 But not more than once in any file,
2875 and not when we aren't loading or reading from a file. */
2877 for (tem
= Vcurrent_load_list
; CONSP (tem
); tem
= XCDR (tem
))
2878 if (NILP (XCDR (tem
)) && STRINGP (XCAR (tem
)))
2883 tem
= Fcons (Qrequire
, feature
);
2884 if (NILP (Fmember (tem
, Vcurrent_load_list
)))
2885 LOADHIST_ATTACH (tem
);
2887 tem
= Fmemq (feature
, Vfeatures
);
2891 ptrdiff_t count
= SPECPDL_INDEX ();
2894 /* This is to make sure that loadup.el gives a clear picture
2895 of what files are preloaded and when. */
2896 if (! NILP (Vpurify_flag
))
2897 error ("(require %s) while preparing to dump",
2898 SDATA (SYMBOL_NAME (feature
)));
2900 /* A certain amount of recursive `require' is legitimate,
2901 but if we require the same feature recursively 3 times,
2903 tem
= require_nesting_list
;
2904 while (! NILP (tem
))
2906 if (! NILP (Fequal (feature
, XCAR (tem
))))
2911 error ("Recursive `require' for feature `%s'",
2912 SDATA (SYMBOL_NAME (feature
)));
2914 /* Update the list for any nested `require's that occur. */
2915 record_unwind_protect (require_unwind
, require_nesting_list
);
2916 require_nesting_list
= Fcons (feature
, require_nesting_list
);
2918 /* Value saved here is to be restored into Vautoload_queue */
2919 record_unwind_protect (un_autoload
, Vautoload_queue
);
2920 Vautoload_queue
= Qt
;
2922 /* Load the file. */
2923 GCPRO2 (feature
, filename
);
2924 tem
= Fload (NILP (filename
) ? Fsymbol_name (feature
) : filename
,
2925 noerror
, Qt
, Qnil
, (NILP (filename
) ? Qt
: Qnil
));
2928 /* If load failed entirely, return nil. */
2930 return unbind_to (count
, Qnil
);
2932 tem
= Fmemq (feature
, Vfeatures
);
2934 error ("Required feature `%s' was not provided",
2935 SDATA (SYMBOL_NAME (feature
)));
2937 /* Once loading finishes, don't undo it. */
2938 Vautoload_queue
= Qt
;
2939 feature
= unbind_to (count
, feature
);
2945 /* Primitives for work of the "widget" library.
2946 In an ideal world, this section would not have been necessary.
2947 However, lisp function calls being as slow as they are, it turns
2948 out that some functions in the widget library (wid-edit.el) are the
2949 bottleneck of Widget operation. Here is their translation to C,
2950 for the sole reason of efficiency. */
2952 DEFUN ("plist-member", Fplist_member
, Splist_member
, 2, 2, 0,
2953 doc
: /* Return non-nil if PLIST has the property PROP.
2954 PLIST is a property list, which is a list of the form
2955 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.
2956 Unlike `plist-get', this allows you to distinguish between a missing
2957 property and a property with the value nil.
2958 The value is actually the tail of PLIST whose car is PROP. */)
2959 (Lisp_Object plist
, Lisp_Object prop
)
2961 while (CONSP (plist
) && !EQ (XCAR (plist
), prop
))
2964 plist
= XCDR (plist
);
2965 plist
= CDR (plist
);
2970 DEFUN ("widget-put", Fwidget_put
, Swidget_put
, 3, 3, 0,
2971 doc
: /* In WIDGET, set PROPERTY to VALUE.
2972 The value can later be retrieved with `widget-get'. */)
2973 (Lisp_Object widget
, Lisp_Object property
, Lisp_Object value
)
2975 CHECK_CONS (widget
);
2976 XSETCDR (widget
, Fplist_put (XCDR (widget
), property
, value
));
2980 DEFUN ("widget-get", Fwidget_get
, Swidget_get
, 2, 2, 0,
2981 doc
: /* In WIDGET, get the value of PROPERTY.
2982 The value could either be specified when the widget was created, or
2983 later with `widget-put'. */)
2984 (Lisp_Object widget
, Lisp_Object property
)
2992 CHECK_CONS (widget
);
2993 tmp
= Fplist_member (XCDR (widget
), property
);
2999 tmp
= XCAR (widget
);
3002 widget
= Fget (tmp
, Qwidget_type
);
3006 DEFUN ("widget-apply", Fwidget_apply
, Swidget_apply
, 2, MANY
, 0,
3007 doc
: /* Apply the value of WIDGET's PROPERTY to the widget itself.
3008 ARGS are passed as extra arguments to the function.
3009 usage: (widget-apply WIDGET PROPERTY &rest ARGS) */)
3010 (ptrdiff_t nargs
, Lisp_Object
*args
)
3012 /* This function can GC. */
3013 Lisp_Object newargs
[3];
3014 struct gcpro gcpro1
, gcpro2
;
3017 newargs
[0] = Fwidget_get (args
[0], args
[1]);
3018 newargs
[1] = args
[0];
3019 newargs
[2] = Flist (nargs
- 2, args
+ 2);
3020 GCPRO2 (newargs
[0], newargs
[2]);
3021 result
= Fapply (3, newargs
);
3026 #ifdef HAVE_LANGINFO_CODESET
3027 #include <langinfo.h>
3030 DEFUN ("locale-info", Flocale_info
, Slocale_info
, 1, 1, 0,
3031 doc
: /* Access locale data ITEM for the current C locale, if available.
3032 ITEM should be one of the following:
3034 `codeset', returning the character set as a string (locale item CODESET);
3036 `days', returning a 7-element vector of day names (locale items DAY_n);
3038 `months', returning a 12-element vector of month names (locale items MON_n);
3040 `paper', returning a list (WIDTH HEIGHT) for the default paper size,
3041 both measured in millimeters (locale items PAPER_WIDTH, PAPER_HEIGHT).
3043 If the system can't provide such information through a call to
3044 `nl_langinfo', or if ITEM isn't from the list above, return nil.
3046 See also Info node `(libc)Locales'.
3048 The data read from the system are decoded using `locale-coding-system'. */)
3052 #ifdef HAVE_LANGINFO_CODESET
3054 if (EQ (item
, Qcodeset
))
3056 str
= nl_langinfo (CODESET
);
3057 return build_string (str
);
3060 else if (EQ (item
, Qdays
)) /* e.g. for calendar-day-name-array */
3062 Lisp_Object v
= Fmake_vector (make_number (7), Qnil
);
3063 const int days
[7] = {DAY_1
, DAY_2
, DAY_3
, DAY_4
, DAY_5
, DAY_6
, DAY_7
};
3065 struct gcpro gcpro1
;
3067 synchronize_system_time_locale ();
3068 for (i
= 0; i
< 7; i
++)
3070 str
= nl_langinfo (days
[i
]);
3071 val
= build_unibyte_string (str
);
3072 /* Fixme: Is this coding system necessarily right, even if
3073 it is consistent with CODESET? If not, what to do? */
3074 ASET (v
, i
, code_convert_string_norecord (val
, Vlocale_coding_system
,
3082 else if (EQ (item
, Qmonths
)) /* e.g. for calendar-month-name-array */
3084 Lisp_Object v
= Fmake_vector (make_number (12), Qnil
);
3085 const int months
[12] = {MON_1
, MON_2
, MON_3
, MON_4
, MON_5
, MON_6
, MON_7
,
3086 MON_8
, MON_9
, MON_10
, MON_11
, MON_12
};
3088 struct gcpro gcpro1
;
3090 synchronize_system_time_locale ();
3091 for (i
= 0; i
< 12; i
++)
3093 str
= nl_langinfo (months
[i
]);
3094 val
= build_unibyte_string (str
);
3095 ASET (v
, i
, code_convert_string_norecord (val
, Vlocale_coding_system
,
3102 /* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
3103 but is in the locale files. This could be used by ps-print. */
3105 else if (EQ (item
, Qpaper
))
3106 return list2i (nl_langinfo (PAPER_WIDTH
), nl_langinfo (PAPER_HEIGHT
));
3107 #endif /* PAPER_WIDTH */
3108 #endif /* HAVE_LANGINFO_CODESET*/
3112 /* base64 encode/decode functions (RFC 2045).
3113 Based on code from GNU recode. */
3115 #define MIME_LINE_LENGTH 76
3117 #define IS_ASCII(Character) \
3119 #define IS_BASE64(Character) \
3120 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
3121 #define IS_BASE64_IGNORABLE(Character) \
3122 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
3123 || (Character) == '\f' || (Character) == '\r')
3125 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
3126 character or return retval if there are no characters left to
3128 #define READ_QUADRUPLET_BYTE(retval) \
3133 if (nchars_return) \
3134 *nchars_return = nchars; \
3139 while (IS_BASE64_IGNORABLE (c))
3141 /* Table of characters coding the 64 values. */
3142 static const char base64_value_to_char
[64] =
3144 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
3145 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
3146 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
3147 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
3148 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
3149 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
3150 '8', '9', '+', '/' /* 60-63 */
3153 /* Table of base64 values for first 128 characters. */
3154 static const short base64_char_to_value
[128] =
3156 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
3157 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
3158 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
3159 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
3160 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
3161 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
3162 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
3163 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
3164 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
3165 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
3166 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
3167 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
3168 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
3171 /* The following diagram shows the logical steps by which three octets
3172 get transformed into four base64 characters.
3174 .--------. .--------. .--------.
3175 |aaaaaabb| |bbbbcccc| |ccdddddd|
3176 `--------' `--------' `--------'
3178 .--------+--------+--------+--------.
3179 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
3180 `--------+--------+--------+--------'
3182 .--------+--------+--------+--------.
3183 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
3184 `--------+--------+--------+--------'
3186 The octets are divided into 6 bit chunks, which are then encoded into
3187 base64 characters. */
3190 static ptrdiff_t base64_encode_1 (const char *, char *, ptrdiff_t, bool, bool);
3191 static ptrdiff_t base64_decode_1 (const char *, char *, ptrdiff_t, bool,
3194 DEFUN ("base64-encode-region", Fbase64_encode_region
, Sbase64_encode_region
,
3196 doc
: /* Base64-encode the region between BEG and END.
3197 Return the length of the encoded text.
3198 Optional third argument NO-LINE-BREAK means do not break long lines
3199 into shorter lines. */)
3200 (Lisp_Object beg
, Lisp_Object end
, Lisp_Object no_line_break
)
3203 ptrdiff_t allength
, length
;
3204 ptrdiff_t ibeg
, iend
, encoded_length
;
3205 ptrdiff_t old_pos
= PT
;
3208 validate_region (&beg
, &end
);
3210 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
3211 iend
= CHAR_TO_BYTE (XFASTINT (end
));
3212 move_gap_both (XFASTINT (beg
), ibeg
);
3214 /* We need to allocate enough room for encoding the text.
3215 We need 33 1/3% more space, plus a newline every 76
3216 characters, and then we round up. */
3217 length
= iend
- ibeg
;
3218 allength
= length
+ length
/3 + 1;
3219 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3221 encoded
= SAFE_ALLOCA (allength
);
3222 encoded_length
= base64_encode_1 ((char *) BYTE_POS_ADDR (ibeg
),
3223 encoded
, length
, NILP (no_line_break
),
3224 !NILP (BVAR (current_buffer
, enable_multibyte_characters
)));
3225 if (encoded_length
> allength
)
3228 if (encoded_length
< 0)
3230 /* The encoding wasn't possible. */
3232 error ("Multibyte character in data for base64 encoding");
3235 /* Now we have encoded the region, so we insert the new contents
3236 and delete the old. (Insert first in order to preserve markers.) */
3237 SET_PT_BOTH (XFASTINT (beg
), ibeg
);
3238 insert (encoded
, encoded_length
);
3240 del_range_byte (ibeg
+ encoded_length
, iend
+ encoded_length
, 1);
3242 /* If point was outside of the region, restore it exactly; else just
3243 move to the beginning of the region. */
3244 if (old_pos
>= XFASTINT (end
))
3245 old_pos
+= encoded_length
- (XFASTINT (end
) - XFASTINT (beg
));
3246 else if (old_pos
> XFASTINT (beg
))
3247 old_pos
= XFASTINT (beg
);
3250 /* We return the length of the encoded text. */
3251 return make_number (encoded_length
);
3254 DEFUN ("base64-encode-string", Fbase64_encode_string
, Sbase64_encode_string
,
3256 doc
: /* Base64-encode STRING and return the result.
3257 Optional second argument NO-LINE-BREAK means do not break long lines
3258 into shorter lines. */)
3259 (Lisp_Object string
, Lisp_Object no_line_break
)
3261 ptrdiff_t allength
, length
, encoded_length
;
3263 Lisp_Object encoded_string
;
3266 CHECK_STRING (string
);
3268 /* We need to allocate enough room for encoding the text.
3269 We need 33 1/3% more space, plus a newline every 76
3270 characters, and then we round up. */
3271 length
= SBYTES (string
);
3272 allength
= length
+ length
/3 + 1;
3273 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3275 /* We need to allocate enough room for decoding the text. */
3276 encoded
= SAFE_ALLOCA (allength
);
3278 encoded_length
= base64_encode_1 (SSDATA (string
),
3279 encoded
, length
, NILP (no_line_break
),
3280 STRING_MULTIBYTE (string
));
3281 if (encoded_length
> allength
)
3284 if (encoded_length
< 0)
3286 /* The encoding wasn't possible. */
3287 error ("Multibyte character in data for base64 encoding");
3290 encoded_string
= make_unibyte_string (encoded
, encoded_length
);
3293 return encoded_string
;
3297 base64_encode_1 (const char *from
, char *to
, ptrdiff_t length
,
3298 bool line_break
, bool multibyte
)
3311 c
= STRING_CHAR_AND_LENGTH ((unsigned char *) from
+ i
, bytes
);
3312 if (CHAR_BYTE8_P (c
))
3313 c
= CHAR_TO_BYTE8 (c
);
3321 /* Wrap line every 76 characters. */
3325 if (counter
< MIME_LINE_LENGTH
/ 4)
3334 /* Process first byte of a triplet. */
3336 *e
++ = base64_value_to_char
[0x3f & c
>> 2];
3337 value
= (0x03 & c
) << 4;
3339 /* Process second byte of a triplet. */
3343 *e
++ = base64_value_to_char
[value
];
3351 c
= STRING_CHAR_AND_LENGTH ((unsigned char *) from
+ i
, bytes
);
3352 if (CHAR_BYTE8_P (c
))
3353 c
= CHAR_TO_BYTE8 (c
);
3361 *e
++ = base64_value_to_char
[value
| (0x0f & c
>> 4)];
3362 value
= (0x0f & c
) << 2;
3364 /* Process third byte of a triplet. */
3368 *e
++ = base64_value_to_char
[value
];
3375 c
= STRING_CHAR_AND_LENGTH ((unsigned char *) from
+ i
, bytes
);
3376 if (CHAR_BYTE8_P (c
))
3377 c
= CHAR_TO_BYTE8 (c
);
3385 *e
++ = base64_value_to_char
[value
| (0x03 & c
>> 6)];
3386 *e
++ = base64_value_to_char
[0x3f & c
];
3393 DEFUN ("base64-decode-region", Fbase64_decode_region
, Sbase64_decode_region
,
3395 doc
: /* Base64-decode the region between BEG and END.
3396 Return the length of the decoded text.
3397 If the region can't be decoded, signal an error and don't modify the buffer. */)
3398 (Lisp_Object beg
, Lisp_Object end
)
3400 ptrdiff_t ibeg
, iend
, length
, allength
;
3402 ptrdiff_t old_pos
= PT
;
3403 ptrdiff_t decoded_length
;
3404 ptrdiff_t inserted_chars
;
3405 bool multibyte
= !NILP (BVAR (current_buffer
, enable_multibyte_characters
));
3408 validate_region (&beg
, &end
);
3410 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
3411 iend
= CHAR_TO_BYTE (XFASTINT (end
));
3413 length
= iend
- ibeg
;
3415 /* We need to allocate enough room for decoding the text. If we are
3416 working on a multibyte buffer, each decoded code may occupy at
3418 allength
= multibyte
? length
* 2 : length
;
3419 decoded
= SAFE_ALLOCA (allength
);
3421 move_gap_both (XFASTINT (beg
), ibeg
);
3422 decoded_length
= base64_decode_1 ((char *) BYTE_POS_ADDR (ibeg
),
3424 multibyte
, &inserted_chars
);
3425 if (decoded_length
> allength
)
3428 if (decoded_length
< 0)
3430 /* The decoding wasn't possible. */
3431 error ("Invalid base64 data");
3434 /* Now we have decoded the region, so we insert the new contents
3435 and delete the old. (Insert first in order to preserve markers.) */
3436 TEMP_SET_PT_BOTH (XFASTINT (beg
), ibeg
);
3437 insert_1_both (decoded
, inserted_chars
, decoded_length
, 0, 1, 0);
3440 /* Delete the original text. */
3441 del_range_both (PT
, PT_BYTE
, XFASTINT (end
) + inserted_chars
,
3442 iend
+ decoded_length
, 1);
3444 /* If point was outside of the region, restore it exactly; else just
3445 move to the beginning of the region. */
3446 if (old_pos
>= XFASTINT (end
))
3447 old_pos
+= inserted_chars
- (XFASTINT (end
) - XFASTINT (beg
));
3448 else if (old_pos
> XFASTINT (beg
))
3449 old_pos
= XFASTINT (beg
);
3450 SET_PT (old_pos
> ZV
? ZV
: old_pos
);
3452 return make_number (inserted_chars
);
3455 DEFUN ("base64-decode-string", Fbase64_decode_string
, Sbase64_decode_string
,
3457 doc
: /* Base64-decode STRING and return the result. */)
3458 (Lisp_Object string
)
3461 ptrdiff_t length
, decoded_length
;
3462 Lisp_Object decoded_string
;
3465 CHECK_STRING (string
);
3467 length
= SBYTES (string
);
3468 /* We need to allocate enough room for decoding the text. */
3469 decoded
= SAFE_ALLOCA (length
);
3471 /* The decoded result should be unibyte. */
3472 decoded_length
= base64_decode_1 (SSDATA (string
), decoded
, length
,
3474 if (decoded_length
> length
)
3476 else if (decoded_length
>= 0)
3477 decoded_string
= make_unibyte_string (decoded
, decoded_length
);
3479 decoded_string
= Qnil
;
3482 if (!STRINGP (decoded_string
))
3483 error ("Invalid base64 data");
3485 return decoded_string
;
3488 /* Base64-decode the data at FROM of LENGTH bytes into TO. If
3489 MULTIBYTE, the decoded result should be in multibyte
3490 form. If NCHARS_RETURN is not NULL, store the number of produced
3491 characters in *NCHARS_RETURN. */
3494 base64_decode_1 (const char *from
, char *to
, ptrdiff_t length
,
3495 bool multibyte
, ptrdiff_t *nchars_return
)
3497 ptrdiff_t i
= 0; /* Used inside READ_QUADRUPLET_BYTE */
3500 unsigned long value
;
3501 ptrdiff_t nchars
= 0;
3505 /* Process first byte of a quadruplet. */
3507 READ_QUADRUPLET_BYTE (e
-to
);
3511 value
= base64_char_to_value
[c
] << 18;
3513 /* Process second byte of a quadruplet. */
3515 READ_QUADRUPLET_BYTE (-1);
3519 value
|= base64_char_to_value
[c
] << 12;
3521 c
= (unsigned char) (value
>> 16);
3522 if (multibyte
&& c
>= 128)
3523 e
+= BYTE8_STRING (c
, e
);
3528 /* Process third byte of a quadruplet. */
3530 READ_QUADRUPLET_BYTE (-1);
3534 READ_QUADRUPLET_BYTE (-1);
3543 value
|= base64_char_to_value
[c
] << 6;
3545 c
= (unsigned char) (0xff & value
>> 8);
3546 if (multibyte
&& c
>= 128)
3547 e
+= BYTE8_STRING (c
, e
);
3552 /* Process fourth byte of a quadruplet. */
3554 READ_QUADRUPLET_BYTE (-1);
3561 value
|= base64_char_to_value
[c
];
3563 c
= (unsigned char) (0xff & value
);
3564 if (multibyte
&& c
>= 128)
3565 e
+= BYTE8_STRING (c
, e
);
3574 /***********************************************************************
3576 ***** Hash Tables *****
3578 ***********************************************************************/
3580 /* Implemented by gerd@gnu.org. This hash table implementation was
3581 inspired by CMUCL hash tables. */
3585 1. For small tables, association lists are probably faster than
3586 hash tables because they have lower overhead.
3588 For uses of hash tables where the O(1) behavior of table
3589 operations is not a requirement, it might therefore be a good idea
3590 not to hash. Instead, we could just do a linear search in the
3591 key_and_value vector of the hash table. This could be done
3592 if a `:linear-search t' argument is given to make-hash-table. */
3595 /* The list of all weak hash tables. Don't staticpro this one. */
3597 static struct Lisp_Hash_Table
*weak_hash_tables
;
3599 /* Various symbols. */
3601 static Lisp_Object Qhash_table_p
;
3602 static Lisp_Object Qkey
, Qvalue
, Qeql
;
3603 Lisp_Object Qeq
, Qequal
;
3604 Lisp_Object QCtest
, QCsize
, QCrehash_size
, QCrehash_threshold
, QCweakness
;
3605 static Lisp_Object Qhash_table_test
, Qkey_or_value
, Qkey_and_value
;
3608 /***********************************************************************
3610 ***********************************************************************/
3613 CHECK_HASH_TABLE (Lisp_Object x
)
3615 CHECK_TYPE (HASH_TABLE_P (x
), Qhash_table_p
, x
);
3619 set_hash_key_and_value (struct Lisp_Hash_Table
*h
, Lisp_Object key_and_value
)
3621 h
->key_and_value
= key_and_value
;
3624 set_hash_next (struct Lisp_Hash_Table
*h
, Lisp_Object next
)
3629 set_hash_next_slot (struct Lisp_Hash_Table
*h
, ptrdiff_t idx
, Lisp_Object val
)
3631 gc_aset (h
->next
, idx
, val
);
3634 set_hash_hash (struct Lisp_Hash_Table
*h
, Lisp_Object hash
)
3639 set_hash_hash_slot (struct Lisp_Hash_Table
*h
, ptrdiff_t idx
, Lisp_Object val
)
3641 gc_aset (h
->hash
, idx
, val
);
3644 set_hash_index (struct Lisp_Hash_Table
*h
, Lisp_Object index
)
3649 set_hash_index_slot (struct Lisp_Hash_Table
*h
, ptrdiff_t idx
, Lisp_Object val
)
3651 gc_aset (h
->index
, idx
, val
);
3654 /* If OBJ is a Lisp hash table, return a pointer to its struct
3655 Lisp_Hash_Table. Otherwise, signal an error. */
3657 static struct Lisp_Hash_Table
*
3658 check_hash_table (Lisp_Object obj
)
3660 CHECK_HASH_TABLE (obj
);
3661 return XHASH_TABLE (obj
);
3665 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
3666 number. A number is "almost" a prime number if it is not divisible
3667 by any integer in the range 2 .. (NEXT_ALMOST_PRIME_LIMIT - 1). */
3670 next_almost_prime (EMACS_INT n
)
3672 verify (NEXT_ALMOST_PRIME_LIMIT
== 11);
3673 for (n
|= 1; ; n
+= 2)
3674 if (n
% 3 != 0 && n
% 5 != 0 && n
% 7 != 0)
3679 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
3680 which USED[I] is non-zero. If found at index I in ARGS, set
3681 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
3682 0. This function is used to extract a keyword/argument pair from
3683 a DEFUN parameter list. */
3686 get_key_arg (Lisp_Object key
, ptrdiff_t nargs
, Lisp_Object
*args
, char *used
)
3690 for (i
= 1; i
< nargs
; i
++)
3691 if (!used
[i
- 1] && EQ (args
[i
- 1], key
))
3702 /* Return a Lisp vector which has the same contents as VEC but has
3703 at least INCR_MIN more entries, where INCR_MIN is positive.
3704 If NITEMS_MAX is not -1, do not grow the vector to be any larger
3705 than NITEMS_MAX. Entries in the resulting
3706 vector that are not copied from VEC are set to nil. */
3709 larger_vector (Lisp_Object vec
, ptrdiff_t incr_min
, ptrdiff_t nitems_max
)
3711 struct Lisp_Vector
*v
;
3712 ptrdiff_t i
, incr
, incr_max
, old_size
, new_size
;
3713 ptrdiff_t C_language_max
= min (PTRDIFF_MAX
, SIZE_MAX
) / sizeof *v
->contents
;
3714 ptrdiff_t n_max
= (0 <= nitems_max
&& nitems_max
< C_language_max
3715 ? nitems_max
: C_language_max
);
3716 eassert (VECTORP (vec
));
3717 eassert (0 < incr_min
&& -1 <= nitems_max
);
3718 old_size
= ASIZE (vec
);
3719 incr_max
= n_max
- old_size
;
3720 incr
= max (incr_min
, min (old_size
>> 1, incr_max
));
3721 if (incr_max
< incr
)
3722 memory_full (SIZE_MAX
);
3723 new_size
= old_size
+ incr
;
3724 v
= allocate_vector (new_size
);
3725 memcpy (v
->contents
, XVECTOR (vec
)->contents
, old_size
* sizeof *v
->contents
);
3726 for (i
= old_size
; i
< new_size
; ++i
)
3727 v
->contents
[i
] = Qnil
;
3728 XSETVECTOR (vec
, v
);
3733 /***********************************************************************
3735 ***********************************************************************/
3737 static struct hash_table_test hashtest_eq
;
3738 struct hash_table_test hashtest_eql
, hashtest_equal
;
3740 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3741 HASH2 in hash table H using `eql'. Value is true if KEY1 and
3742 KEY2 are the same. */
3745 cmpfn_eql (struct hash_table_test
*ht
,
3749 return (FLOATP (key1
)
3751 && XFLOAT_DATA (key1
) == XFLOAT_DATA (key2
));
3755 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3756 HASH2 in hash table H using `equal'. Value is true if KEY1 and
3757 KEY2 are the same. */
3760 cmpfn_equal (struct hash_table_test
*ht
,
3764 return !NILP (Fequal (key1
, key2
));
3768 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
3769 HASH2 in hash table H using H->user_cmp_function. Value is true
3770 if KEY1 and KEY2 are the same. */
3773 cmpfn_user_defined (struct hash_table_test
*ht
,
3777 Lisp_Object args
[3];
3779 args
[0] = ht
->user_cmp_function
;
3782 return !NILP (Ffuncall (3, args
));
3786 /* Value is a hash code for KEY for use in hash table H which uses
3787 `eq' to compare keys. The hash code returned is guaranteed to fit
3788 in a Lisp integer. */
3791 hashfn_eq (struct hash_table_test
*ht
, Lisp_Object key
)
3793 EMACS_UINT hash
= XHASH (key
) ^ XTYPE (key
);
3797 /* Value is a hash code for KEY for use in hash table H which uses
3798 `eql' to compare keys. The hash code returned is guaranteed to fit
3799 in a Lisp integer. */
3802 hashfn_eql (struct hash_table_test
*ht
, Lisp_Object key
)
3806 hash
= sxhash (key
, 0);
3808 hash
= XHASH (key
) ^ XTYPE (key
);
3812 /* Value is a hash code for KEY for use in hash table H which uses
3813 `equal' to compare keys. The hash code returned is guaranteed to fit
3814 in a Lisp integer. */
3817 hashfn_equal (struct hash_table_test
*ht
, Lisp_Object key
)
3819 EMACS_UINT hash
= sxhash (key
, 0);
3823 /* Value is a hash code for KEY for use in hash table H which uses as
3824 user-defined function to compare keys. The hash code returned is
3825 guaranteed to fit in a Lisp integer. */
3828 hashfn_user_defined (struct hash_table_test
*ht
, Lisp_Object key
)
3830 Lisp_Object args
[2], hash
;
3832 args
[0] = ht
->user_hash_function
;
3834 hash
= Ffuncall (2, args
);
3835 return hashfn_eq (ht
, hash
);
3838 /* An upper bound on the size of a hash table index. It must fit in
3839 ptrdiff_t and be a valid Emacs fixnum. */
3840 #define INDEX_SIZE_BOUND \
3841 ((ptrdiff_t) min (MOST_POSITIVE_FIXNUM, PTRDIFF_MAX / word_size))
3843 /* Create and initialize a new hash table.
3845 TEST specifies the test the hash table will use to compare keys.
3846 It must be either one of the predefined tests `eq', `eql' or
3847 `equal' or a symbol denoting a user-defined test named TEST with
3848 test and hash functions USER_TEST and USER_HASH.
3850 Give the table initial capacity SIZE, SIZE >= 0, an integer.
3852 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
3853 new size when it becomes full is computed by adding REHASH_SIZE to
3854 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
3855 table's new size is computed by multiplying its old size with
3858 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
3859 be resized when the ratio of (number of entries in the table) /
3860 (table size) is >= REHASH_THRESHOLD.
3862 WEAK specifies the weakness of the table. If non-nil, it must be
3863 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
3866 make_hash_table (struct hash_table_test test
,
3867 Lisp_Object size
, Lisp_Object rehash_size
,
3868 Lisp_Object rehash_threshold
, Lisp_Object weak
)
3870 struct Lisp_Hash_Table
*h
;
3872 EMACS_INT index_size
, sz
;
3876 /* Preconditions. */
3877 eassert (SYMBOLP (test
.name
));
3878 eassert (INTEGERP (size
) && XINT (size
) >= 0);
3879 eassert ((INTEGERP (rehash_size
) && XINT (rehash_size
) > 0)
3880 || (FLOATP (rehash_size
) && 1 < XFLOAT_DATA (rehash_size
)));
3881 eassert (FLOATP (rehash_threshold
)
3882 && 0 < XFLOAT_DATA (rehash_threshold
)
3883 && XFLOAT_DATA (rehash_threshold
) <= 1.0);
3885 if (XFASTINT (size
) == 0)
3886 size
= make_number (1);
3888 sz
= XFASTINT (size
);
3889 index_float
= sz
/ XFLOAT_DATA (rehash_threshold
);
3890 index_size
= (index_float
< INDEX_SIZE_BOUND
+ 1
3891 ? next_almost_prime (index_float
)
3892 : INDEX_SIZE_BOUND
+ 1);
3893 if (INDEX_SIZE_BOUND
< max (index_size
, 2 * sz
))
3894 error ("Hash table too large");
3896 /* Allocate a table and initialize it. */
3897 h
= allocate_hash_table ();
3899 /* Initialize hash table slots. */
3902 h
->rehash_threshold
= rehash_threshold
;
3903 h
->rehash_size
= rehash_size
;
3905 h
->key_and_value
= Fmake_vector (make_number (2 * sz
), Qnil
);
3906 h
->hash
= Fmake_vector (size
, Qnil
);
3907 h
->next
= Fmake_vector (size
, Qnil
);
3908 h
->index
= Fmake_vector (make_number (index_size
), Qnil
);
3910 /* Set up the free list. */
3911 for (i
= 0; i
< sz
- 1; ++i
)
3912 set_hash_next_slot (h
, i
, make_number (i
+ 1));
3913 h
->next_free
= make_number (0);
3915 XSET_HASH_TABLE (table
, h
);
3916 eassert (HASH_TABLE_P (table
));
3917 eassert (XHASH_TABLE (table
) == h
);
3919 /* Maybe add this hash table to the list of all weak hash tables. */
3921 h
->next_weak
= NULL
;
3924 h
->next_weak
= weak_hash_tables
;
3925 weak_hash_tables
= h
;
3932 /* Return a copy of hash table H1. Keys and values are not copied,
3933 only the table itself is. */
3936 copy_hash_table (struct Lisp_Hash_Table
*h1
)
3939 struct Lisp_Hash_Table
*h2
;
3941 h2
= allocate_hash_table ();
3943 h2
->key_and_value
= Fcopy_sequence (h1
->key_and_value
);
3944 h2
->hash
= Fcopy_sequence (h1
->hash
);
3945 h2
->next
= Fcopy_sequence (h1
->next
);
3946 h2
->index
= Fcopy_sequence (h1
->index
);
3947 XSET_HASH_TABLE (table
, h2
);
3949 /* Maybe add this hash table to the list of all weak hash tables. */
3950 if (!NILP (h2
->weak
))
3952 h2
->next_weak
= weak_hash_tables
;
3953 weak_hash_tables
= h2
;
3960 /* Resize hash table H if it's too full. If H cannot be resized
3961 because it's already too large, throw an error. */
3964 maybe_resize_hash_table (struct Lisp_Hash_Table
*h
)
3966 if (NILP (h
->next_free
))
3968 ptrdiff_t old_size
= HASH_TABLE_SIZE (h
);
3969 EMACS_INT new_size
, index_size
, nsize
;
3973 if (INTEGERP (h
->rehash_size
))
3974 new_size
= old_size
+ XFASTINT (h
->rehash_size
);
3977 double float_new_size
= old_size
* XFLOAT_DATA (h
->rehash_size
);
3978 if (float_new_size
< INDEX_SIZE_BOUND
+ 1)
3980 new_size
= float_new_size
;
3981 if (new_size
<= old_size
)
3982 new_size
= old_size
+ 1;
3985 new_size
= INDEX_SIZE_BOUND
+ 1;
3987 index_float
= new_size
/ XFLOAT_DATA (h
->rehash_threshold
);
3988 index_size
= (index_float
< INDEX_SIZE_BOUND
+ 1
3989 ? next_almost_prime (index_float
)
3990 : INDEX_SIZE_BOUND
+ 1);
3991 nsize
= max (index_size
, 2 * new_size
);
3992 if (INDEX_SIZE_BOUND
< nsize
)
3993 error ("Hash table too large to resize");
3995 #ifdef ENABLE_CHECKING
3996 if (HASH_TABLE_P (Vpurify_flag
)
3997 && XHASH_TABLE (Vpurify_flag
) == h
)
3998 Fmessage (2, ((Lisp_Object
[])
3999 { build_string ("Growing hash table to: %d"),
4000 make_number (new_size
) }));
4003 set_hash_key_and_value (h
, larger_vector (h
->key_and_value
,
4004 2 * (new_size
- old_size
), -1));
4005 set_hash_next (h
, larger_vector (h
->next
, new_size
- old_size
, -1));
4006 set_hash_hash (h
, larger_vector (h
->hash
, new_size
- old_size
, -1));
4007 set_hash_index (h
, Fmake_vector (make_number (index_size
), Qnil
));
4009 /* Update the free list. Do it so that new entries are added at
4010 the end of the free list. This makes some operations like
4012 for (i
= old_size
; i
< new_size
- 1; ++i
)
4013 set_hash_next_slot (h
, i
, make_number (i
+ 1));
4015 if (!NILP (h
->next_free
))
4017 Lisp_Object last
, next
;
4019 last
= h
->next_free
;
4020 while (next
= HASH_NEXT (h
, XFASTINT (last
)),
4024 set_hash_next_slot (h
, XFASTINT (last
), make_number (old_size
));
4027 XSETFASTINT (h
->next_free
, old_size
);
4030 for (i
= 0; i
< old_size
; ++i
)
4031 if (!NILP (HASH_HASH (h
, i
)))
4033 EMACS_UINT hash_code
= XUINT (HASH_HASH (h
, i
));
4034 ptrdiff_t start_of_bucket
= hash_code
% ASIZE (h
->index
);
4035 set_hash_next_slot (h
, i
, HASH_INDEX (h
, start_of_bucket
));
4036 set_hash_index_slot (h
, start_of_bucket
, make_number (i
));
4042 /* Lookup KEY in hash table H. If HASH is non-null, return in *HASH
4043 the hash code of KEY. Value is the index of the entry in H
4044 matching KEY, or -1 if not found. */
4047 hash_lookup (struct Lisp_Hash_Table
*h
, Lisp_Object key
, EMACS_UINT
*hash
)
4049 EMACS_UINT hash_code
;
4050 ptrdiff_t start_of_bucket
;
4053 hash_code
= h
->test
.hashfn (&h
->test
, key
);
4054 eassert ((hash_code
& ~INTMASK
) == 0);
4058 start_of_bucket
= hash_code
% ASIZE (h
->index
);
4059 idx
= HASH_INDEX (h
, start_of_bucket
);
4061 /* We need not gcpro idx since it's either an integer or nil. */
4064 ptrdiff_t i
= XFASTINT (idx
);
4065 if (EQ (key
, HASH_KEY (h
, i
))
4067 && hash_code
== XUINT (HASH_HASH (h
, i
))
4068 && h
->test
.cmpfn (&h
->test
, key
, HASH_KEY (h
, i
))))
4070 idx
= HASH_NEXT (h
, i
);
4073 return NILP (idx
) ? -1 : XFASTINT (idx
);
4077 /* Put an entry into hash table H that associates KEY with VALUE.
4078 HASH is a previously computed hash code of KEY.
4079 Value is the index of the entry in H matching KEY. */
4082 hash_put (struct Lisp_Hash_Table
*h
, Lisp_Object key
, Lisp_Object value
,
4085 ptrdiff_t start_of_bucket
, i
;
4087 eassert ((hash
& ~INTMASK
) == 0);
4089 /* Increment count after resizing because resizing may fail. */
4090 maybe_resize_hash_table (h
);
4093 /* Store key/value in the key_and_value vector. */
4094 i
= XFASTINT (h
->next_free
);
4095 h
->next_free
= HASH_NEXT (h
, i
);
4096 set_hash_key_slot (h
, i
, key
);
4097 set_hash_value_slot (h
, i
, value
);
4099 /* Remember its hash code. */
4100 set_hash_hash_slot (h
, i
, make_number (hash
));
4102 /* Add new entry to its collision chain. */
4103 start_of_bucket
= hash
% ASIZE (h
->index
);
4104 set_hash_next_slot (h
, i
, HASH_INDEX (h
, start_of_bucket
));
4105 set_hash_index_slot (h
, start_of_bucket
, make_number (i
));
4110 /* Remove the entry matching KEY from hash table H, if there is one. */
4113 hash_remove_from_table (struct Lisp_Hash_Table
*h
, Lisp_Object key
)
4115 EMACS_UINT hash_code
;
4116 ptrdiff_t start_of_bucket
;
4117 Lisp_Object idx
, prev
;
4119 hash_code
= h
->test
.hashfn (&h
->test
, key
);
4120 eassert ((hash_code
& ~INTMASK
) == 0);
4121 start_of_bucket
= hash_code
% ASIZE (h
->index
);
4122 idx
= HASH_INDEX (h
, start_of_bucket
);
4125 /* We need not gcpro idx, prev since they're either integers or nil. */
4128 ptrdiff_t i
= XFASTINT (idx
);
4130 if (EQ (key
, HASH_KEY (h
, i
))
4132 && hash_code
== XUINT (HASH_HASH (h
, i
))
4133 && h
->test
.cmpfn (&h
->test
, key
, HASH_KEY (h
, i
))))
4135 /* Take entry out of collision chain. */
4137 set_hash_index_slot (h
, start_of_bucket
, HASH_NEXT (h
, i
));
4139 set_hash_next_slot (h
, XFASTINT (prev
), HASH_NEXT (h
, i
));
4141 /* Clear slots in key_and_value and add the slots to
4143 set_hash_key_slot (h
, i
, Qnil
);
4144 set_hash_value_slot (h
, i
, Qnil
);
4145 set_hash_hash_slot (h
, i
, Qnil
);
4146 set_hash_next_slot (h
, i
, h
->next_free
);
4147 h
->next_free
= make_number (i
);
4149 eassert (h
->count
>= 0);
4155 idx
= HASH_NEXT (h
, i
);
4161 /* Clear hash table H. */
4164 hash_clear (struct Lisp_Hash_Table
*h
)
4168 ptrdiff_t i
, size
= HASH_TABLE_SIZE (h
);
4170 for (i
= 0; i
< size
; ++i
)
4172 set_hash_next_slot (h
, i
, i
< size
- 1 ? make_number (i
+ 1) : Qnil
);
4173 set_hash_key_slot (h
, i
, Qnil
);
4174 set_hash_value_slot (h
, i
, Qnil
);
4175 set_hash_hash_slot (h
, i
, Qnil
);
4178 for (i
= 0; i
< ASIZE (h
->index
); ++i
)
4179 ASET (h
->index
, i
, Qnil
);
4181 h
->next_free
= make_number (0);
4188 /************************************************************************
4190 ************************************************************************/
4192 /* Sweep weak hash table H. REMOVE_ENTRIES_P means remove
4193 entries from the table that don't survive the current GC.
4194 !REMOVE_ENTRIES_P means mark entries that are in use. Value is
4195 true if anything was marked. */
4198 sweep_weak_table (struct Lisp_Hash_Table
*h
, bool remove_entries_p
)
4200 ptrdiff_t bucket
, n
;
4203 n
= ASIZE (h
->index
) & ~ARRAY_MARK_FLAG
;
4206 for (bucket
= 0; bucket
< n
; ++bucket
)
4208 Lisp_Object idx
, next
, prev
;
4210 /* Follow collision chain, removing entries that
4211 don't survive this garbage collection. */
4213 for (idx
= HASH_INDEX (h
, bucket
); !NILP (idx
); idx
= next
)
4215 ptrdiff_t i
= XFASTINT (idx
);
4216 bool key_known_to_survive_p
= survives_gc_p (HASH_KEY (h
, i
));
4217 bool value_known_to_survive_p
= survives_gc_p (HASH_VALUE (h
, i
));
4220 if (EQ (h
->weak
, Qkey
))
4221 remove_p
= !key_known_to_survive_p
;
4222 else if (EQ (h
->weak
, Qvalue
))
4223 remove_p
= !value_known_to_survive_p
;
4224 else if (EQ (h
->weak
, Qkey_or_value
))
4225 remove_p
= !(key_known_to_survive_p
|| value_known_to_survive_p
);
4226 else if (EQ (h
->weak
, Qkey_and_value
))
4227 remove_p
= !(key_known_to_survive_p
&& value_known_to_survive_p
);
4231 next
= HASH_NEXT (h
, i
);
4233 if (remove_entries_p
)
4237 /* Take out of collision chain. */
4239 set_hash_index_slot (h
, bucket
, next
);
4241 set_hash_next_slot (h
, XFASTINT (prev
), next
);
4243 /* Add to free list. */
4244 set_hash_next_slot (h
, i
, h
->next_free
);
4247 /* Clear key, value, and hash. */
4248 set_hash_key_slot (h
, i
, Qnil
);
4249 set_hash_value_slot (h
, i
, Qnil
);
4250 set_hash_hash_slot (h
, i
, Qnil
);
4263 /* Make sure key and value survive. */
4264 if (!key_known_to_survive_p
)
4266 mark_object (HASH_KEY (h
, i
));
4270 if (!value_known_to_survive_p
)
4272 mark_object (HASH_VALUE (h
, i
));
4283 /* Remove elements from weak hash tables that don't survive the
4284 current garbage collection. Remove weak tables that don't survive
4285 from Vweak_hash_tables. Called from gc_sweep. */
4287 NO_INLINE
/* For better stack traces */
4289 sweep_weak_hash_tables (void)
4291 struct Lisp_Hash_Table
*h
, *used
, *next
;
4294 /* Mark all keys and values that are in use. Keep on marking until
4295 there is no more change. This is necessary for cases like
4296 value-weak table A containing an entry X -> Y, where Y is used in a
4297 key-weak table B, Z -> Y. If B comes after A in the list of weak
4298 tables, X -> Y might be removed from A, although when looking at B
4299 one finds that it shouldn't. */
4303 for (h
= weak_hash_tables
; h
; h
= h
->next_weak
)
4305 if (h
->header
.size
& ARRAY_MARK_FLAG
)
4306 marked
|= sweep_weak_table (h
, 0);
4311 /* Remove tables and entries that aren't used. */
4312 for (h
= weak_hash_tables
, used
= NULL
; h
; h
= next
)
4314 next
= h
->next_weak
;
4316 if (h
->header
.size
& ARRAY_MARK_FLAG
)
4318 /* TABLE is marked as used. Sweep its contents. */
4320 sweep_weak_table (h
, 1);
4322 /* Add table to the list of used weak hash tables. */
4323 h
->next_weak
= used
;
4328 weak_hash_tables
= used
;
4333 /***********************************************************************
4334 Hash Code Computation
4335 ***********************************************************************/
4337 /* Maximum depth up to which to dive into Lisp structures. */
4339 #define SXHASH_MAX_DEPTH 3
4341 /* Maximum length up to which to take list and vector elements into
4344 #define SXHASH_MAX_LEN 7
4346 /* Return a hash for string PTR which has length LEN. The hash value
4347 can be any EMACS_UINT value. */
4350 hash_string (char const *ptr
, ptrdiff_t len
)
4352 char const *p
= ptr
;
4353 char const *end
= p
+ len
;
4355 EMACS_UINT hash
= 0;
4360 hash
= sxhash_combine (hash
, c
);
4366 /* Return a hash for string PTR which has length LEN. The hash
4367 code returned is guaranteed to fit in a Lisp integer. */
4370 sxhash_string (char const *ptr
, ptrdiff_t len
)
4372 EMACS_UINT hash
= hash_string (ptr
, len
);
4373 return SXHASH_REDUCE (hash
);
4376 /* Return a hash for the floating point value VAL. */
4379 sxhash_float (double val
)
4381 EMACS_UINT hash
= 0;
4383 WORDS_PER_DOUBLE
= (sizeof val
/ sizeof hash
4384 + (sizeof val
% sizeof hash
!= 0))
4388 EMACS_UINT word
[WORDS_PER_DOUBLE
];
4392 memset (&u
.val
+ 1, 0, sizeof u
- sizeof u
.val
);
4393 for (i
= 0; i
< WORDS_PER_DOUBLE
; i
++)
4394 hash
= sxhash_combine (hash
, u
.word
[i
]);
4395 return SXHASH_REDUCE (hash
);
4398 /* Return a hash for list LIST. DEPTH is the current depth in the
4399 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
4402 sxhash_list (Lisp_Object list
, int depth
)
4404 EMACS_UINT hash
= 0;
4407 if (depth
< SXHASH_MAX_DEPTH
)
4409 CONSP (list
) && i
< SXHASH_MAX_LEN
;
4410 list
= XCDR (list
), ++i
)
4412 EMACS_UINT hash2
= sxhash (XCAR (list
), depth
+ 1);
4413 hash
= sxhash_combine (hash
, hash2
);
4418 EMACS_UINT hash2
= sxhash (list
, depth
+ 1);
4419 hash
= sxhash_combine (hash
, hash2
);
4422 return SXHASH_REDUCE (hash
);
4426 /* Return a hash for vector VECTOR. DEPTH is the current depth in
4427 the Lisp structure. */
4430 sxhash_vector (Lisp_Object vec
, int depth
)
4432 EMACS_UINT hash
= ASIZE (vec
);
4435 n
= min (SXHASH_MAX_LEN
, ASIZE (vec
));
4436 for (i
= 0; i
< n
; ++i
)
4438 EMACS_UINT hash2
= sxhash (AREF (vec
, i
), depth
+ 1);
4439 hash
= sxhash_combine (hash
, hash2
);
4442 return SXHASH_REDUCE (hash
);
4445 /* Return a hash for bool-vector VECTOR. */
4448 sxhash_bool_vector (Lisp_Object vec
)
4450 EMACS_INT size
= bool_vector_size (vec
);
4451 EMACS_UINT hash
= size
;
4454 n
= min (SXHASH_MAX_LEN
, bool_vector_words (size
));
4455 for (i
= 0; i
< n
; ++i
)
4456 hash
= sxhash_combine (hash
, bool_vector_data (vec
)[i
]);
4458 return SXHASH_REDUCE (hash
);
4462 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
4463 structure. Value is an unsigned integer clipped to INTMASK. */
4466 sxhash (Lisp_Object obj
, int depth
)
4470 if (depth
> SXHASH_MAX_DEPTH
)
4473 switch (XTYPE (obj
))
4485 hash
= sxhash_string (SSDATA (obj
), SBYTES (obj
));
4488 /* This can be everything from a vector to an overlay. */
4489 case Lisp_Vectorlike
:
4491 /* According to the CL HyperSpec, two arrays are equal only if
4492 they are `eq', except for strings and bit-vectors. In
4493 Emacs, this works differently. We have to compare element
4495 hash
= sxhash_vector (obj
, depth
);
4496 else if (BOOL_VECTOR_P (obj
))
4497 hash
= sxhash_bool_vector (obj
);
4499 /* Others are `equal' if they are `eq', so let's take their
4505 hash
= sxhash_list (obj
, depth
);
4509 hash
= sxhash_float (XFLOAT_DATA (obj
));
4521 /***********************************************************************
4523 ***********************************************************************/
4526 DEFUN ("sxhash", Fsxhash
, Ssxhash
, 1, 1, 0,
4527 doc
: /* Compute a hash code for OBJ and return it as integer. */)
4530 EMACS_UINT hash
= sxhash (obj
, 0);
4531 return make_number (hash
);
4535 DEFUN ("make-hash-table", Fmake_hash_table
, Smake_hash_table
, 0, MANY
, 0,
4536 doc
: /* Create and return a new hash table.
4538 Arguments are specified as keyword/argument pairs. The following
4539 arguments are defined:
4541 :test TEST -- TEST must be a symbol that specifies how to compare
4542 keys. Default is `eql'. Predefined are the tests `eq', `eql', and
4543 `equal'. User-supplied test and hash functions can be specified via
4544 `define-hash-table-test'.
4546 :size SIZE -- A hint as to how many elements will be put in the table.
4549 :rehash-size REHASH-SIZE - Indicates how to expand the table when it
4550 fills up. If REHASH-SIZE is an integer, increase the size by that
4551 amount. If it is a float, it must be > 1.0, and the new size is the
4552 old size multiplied by that factor. Default is 1.5.
4554 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.
4555 Resize the hash table when the ratio (number of entries / table size)
4556 is greater than or equal to THRESHOLD. Default is 0.8.
4558 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',
4559 `key-or-value', or `key-and-value'. If WEAK is not nil, the table
4560 returned is a weak table. Key/value pairs are removed from a weak
4561 hash table when there are no non-weak references pointing to their
4562 key, value, one of key or value, or both key and value, depending on
4563 WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
4566 usage: (make-hash-table &rest KEYWORD-ARGS) */)
4567 (ptrdiff_t nargs
, Lisp_Object
*args
)
4569 Lisp_Object test
, size
, rehash_size
, rehash_threshold
, weak
;
4570 struct hash_table_test testdesc
;
4574 /* The vector `used' is used to keep track of arguments that
4575 have been consumed. */
4576 char *used
= SAFE_ALLOCA (nargs
* sizeof *used
);
4577 memset (used
, 0, nargs
* sizeof *used
);
4579 /* See if there's a `:test TEST' among the arguments. */
4580 i
= get_key_arg (QCtest
, nargs
, args
, used
);
4581 test
= i
? args
[i
] : Qeql
;
4583 testdesc
= hashtest_eq
;
4584 else if (EQ (test
, Qeql
))
4585 testdesc
= hashtest_eql
;
4586 else if (EQ (test
, Qequal
))
4587 testdesc
= hashtest_equal
;
4590 /* See if it is a user-defined test. */
4593 prop
= Fget (test
, Qhash_table_test
);
4594 if (!CONSP (prop
) || !CONSP (XCDR (prop
)))
4595 signal_error ("Invalid hash table test", test
);
4596 testdesc
.name
= test
;
4597 testdesc
.user_cmp_function
= XCAR (prop
);
4598 testdesc
.user_hash_function
= XCAR (XCDR (prop
));
4599 testdesc
.hashfn
= hashfn_user_defined
;
4600 testdesc
.cmpfn
= cmpfn_user_defined
;
4603 /* See if there's a `:size SIZE' argument. */
4604 i
= get_key_arg (QCsize
, nargs
, args
, used
);
4605 size
= i
? args
[i
] : Qnil
;
4607 size
= make_number (DEFAULT_HASH_SIZE
);
4608 else if (!INTEGERP (size
) || XINT (size
) < 0)
4609 signal_error ("Invalid hash table size", size
);
4611 /* Look for `:rehash-size SIZE'. */
4612 i
= get_key_arg (QCrehash_size
, nargs
, args
, used
);
4613 rehash_size
= i
? args
[i
] : make_float (DEFAULT_REHASH_SIZE
);
4614 if (! ((INTEGERP (rehash_size
) && 0 < XINT (rehash_size
))
4615 || (FLOATP (rehash_size
) && 1 < XFLOAT_DATA (rehash_size
))))
4616 signal_error ("Invalid hash table rehash size", rehash_size
);
4618 /* Look for `:rehash-threshold THRESHOLD'. */
4619 i
= get_key_arg (QCrehash_threshold
, nargs
, args
, used
);
4620 rehash_threshold
= i
? args
[i
] : make_float (DEFAULT_REHASH_THRESHOLD
);
4621 if (! (FLOATP (rehash_threshold
)
4622 && 0 < XFLOAT_DATA (rehash_threshold
)
4623 && XFLOAT_DATA (rehash_threshold
) <= 1))
4624 signal_error ("Invalid hash table rehash threshold", rehash_threshold
);
4626 /* Look for `:weakness WEAK'. */
4627 i
= get_key_arg (QCweakness
, nargs
, args
, used
);
4628 weak
= i
? args
[i
] : Qnil
;
4630 weak
= Qkey_and_value
;
4633 && !EQ (weak
, Qvalue
)
4634 && !EQ (weak
, Qkey_or_value
)
4635 && !EQ (weak
, Qkey_and_value
))
4636 signal_error ("Invalid hash table weakness", weak
);
4638 /* Now, all args should have been used up, or there's a problem. */
4639 for (i
= 0; i
< nargs
; ++i
)
4641 signal_error ("Invalid argument list", args
[i
]);
4644 return make_hash_table (testdesc
, size
, rehash_size
, rehash_threshold
, weak
);
4648 DEFUN ("copy-hash-table", Fcopy_hash_table
, Scopy_hash_table
, 1, 1, 0,
4649 doc
: /* Return a copy of hash table TABLE. */)
4652 return copy_hash_table (check_hash_table (table
));
4656 DEFUN ("hash-table-count", Fhash_table_count
, Shash_table_count
, 1, 1, 0,
4657 doc
: /* Return the number of elements in TABLE. */)
4660 return make_number (check_hash_table (table
)->count
);
4664 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size
,
4665 Shash_table_rehash_size
, 1, 1, 0,
4666 doc
: /* Return the current rehash size of TABLE. */)
4669 return check_hash_table (table
)->rehash_size
;
4673 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold
,
4674 Shash_table_rehash_threshold
, 1, 1, 0,
4675 doc
: /* Return the current rehash threshold of TABLE. */)
4678 return check_hash_table (table
)->rehash_threshold
;
4682 DEFUN ("hash-table-size", Fhash_table_size
, Shash_table_size
, 1, 1, 0,
4683 doc
: /* Return the size of TABLE.
4684 The size can be used as an argument to `make-hash-table' to create
4685 a hash table than can hold as many elements as TABLE holds
4686 without need for resizing. */)
4689 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4690 return make_number (HASH_TABLE_SIZE (h
));
4694 DEFUN ("hash-table-test", Fhash_table_test
, Shash_table_test
, 1, 1, 0,
4695 doc
: /* Return the test TABLE uses. */)
4698 return check_hash_table (table
)->test
.name
;
4702 DEFUN ("hash-table-weakness", Fhash_table_weakness
, Shash_table_weakness
,
4704 doc
: /* Return the weakness of TABLE. */)
4707 return check_hash_table (table
)->weak
;
4711 DEFUN ("hash-table-p", Fhash_table_p
, Shash_table_p
, 1, 1, 0,
4712 doc
: /* Return t if OBJ is a Lisp hash table object. */)
4715 return HASH_TABLE_P (obj
) ? Qt
: Qnil
;
4719 DEFUN ("clrhash", Fclrhash
, Sclrhash
, 1, 1, 0,
4720 doc
: /* Clear hash table TABLE and return it. */)
4723 hash_clear (check_hash_table (table
));
4724 /* Be compatible with XEmacs. */
4729 DEFUN ("gethash", Fgethash
, Sgethash
, 2, 3, 0,
4730 doc
: /* Look up KEY in TABLE and return its associated value.
4731 If KEY is not found, return DFLT which defaults to nil. */)
4732 (Lisp_Object key
, Lisp_Object table
, Lisp_Object dflt
)
4734 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4735 ptrdiff_t i
= hash_lookup (h
, key
, NULL
);
4736 return i
>= 0 ? HASH_VALUE (h
, i
) : dflt
;
4740 DEFUN ("puthash", Fputhash
, Sputhash
, 3, 3, 0,
4741 doc
: /* Associate KEY with VALUE in hash table TABLE.
4742 If KEY is already present in table, replace its current value with
4743 VALUE. In any case, return VALUE. */)
4744 (Lisp_Object key
, Lisp_Object value
, Lisp_Object table
)
4746 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4750 i
= hash_lookup (h
, key
, &hash
);
4752 set_hash_value_slot (h
, i
, value
);
4754 hash_put (h
, key
, value
, hash
);
4760 DEFUN ("remhash", Fremhash
, Sremhash
, 2, 2, 0,
4761 doc
: /* Remove KEY from TABLE. */)
4762 (Lisp_Object key
, Lisp_Object table
)
4764 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4765 hash_remove_from_table (h
, key
);
4770 DEFUN ("maphash", Fmaphash
, Smaphash
, 2, 2, 0,
4771 doc
: /* Call FUNCTION for all entries in hash table TABLE.
4772 FUNCTION is called with two arguments, KEY and VALUE.
4773 `maphash' always returns nil. */)
4774 (Lisp_Object function
, Lisp_Object table
)
4776 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4777 Lisp_Object args
[3];
4780 for (i
= 0; i
< HASH_TABLE_SIZE (h
); ++i
)
4781 if (!NILP (HASH_HASH (h
, i
)))
4784 args
[1] = HASH_KEY (h
, i
);
4785 args
[2] = HASH_VALUE (h
, i
);
4793 DEFUN ("define-hash-table-test", Fdefine_hash_table_test
,
4794 Sdefine_hash_table_test
, 3, 3, 0,
4795 doc
: /* Define a new hash table test with name NAME, a symbol.
4797 In hash tables created with NAME specified as test, use TEST to
4798 compare keys, and HASH for computing hash codes of keys.
4800 TEST must be a function taking two arguments and returning non-nil if
4801 both arguments are the same. HASH must be a function taking one
4802 argument and returning an object that is the hash code of the argument.
4803 It should be the case that if (eq (funcall HASH x1) (funcall HASH x2))
4804 returns nil, then (funcall TEST x1 x2) also returns nil. */)
4805 (Lisp_Object name
, Lisp_Object test
, Lisp_Object hash
)
4807 return Fput (name
, Qhash_table_test
, list2 (test
, hash
));
4812 /************************************************************************
4813 MD5, SHA-1, and SHA-2
4814 ************************************************************************/
4821 /* ALGORITHM is a symbol: md5, sha1, sha224 and so on. */
4824 secure_hash (Lisp_Object algorithm
, Lisp_Object object
, Lisp_Object start
,
4825 Lisp_Object end
, Lisp_Object coding_system
, Lisp_Object noerror
,
4829 ptrdiff_t size
, start_char
= 0, start_byte
, end_char
= 0, end_byte
;
4830 register EMACS_INT b
, e
;
4831 register struct buffer
*bp
;
4834 void *(*hash_func
) (const char *, size_t, void *);
4837 CHECK_SYMBOL (algorithm
);
4839 if (STRINGP (object
))
4841 if (NILP (coding_system
))
4843 /* Decide the coding-system to encode the data with. */
4845 if (STRING_MULTIBYTE (object
))
4846 /* use default, we can't guess correct value */
4847 coding_system
= preferred_coding_system ();
4849 coding_system
= Qraw_text
;
4852 if (NILP (Fcoding_system_p (coding_system
)))
4854 /* Invalid coding system. */
4856 if (!NILP (noerror
))
4857 coding_system
= Qraw_text
;
4859 xsignal1 (Qcoding_system_error
, coding_system
);
4862 if (STRING_MULTIBYTE (object
))
4863 object
= code_convert_string (object
, coding_system
, Qnil
, 1, 0, 1);
4865 size
= SCHARS (object
);
4866 validate_subarray (object
, start
, end
, size
, &start_char
, &end_char
);
4868 start_byte
= !start_char
? 0 : string_char_to_byte (object
, start_char
);
4869 end_byte
= (end_char
== size
4871 : string_char_to_byte (object
, end_char
));
4875 struct buffer
*prev
= current_buffer
;
4877 record_unwind_current_buffer ();
4879 CHECK_BUFFER (object
);
4881 bp
= XBUFFER (object
);
4882 set_buffer_internal (bp
);
4888 CHECK_NUMBER_COERCE_MARKER (start
);
4896 CHECK_NUMBER_COERCE_MARKER (end
);
4901 temp
= b
, b
= e
, e
= temp
;
4903 if (!(BEGV
<= b
&& e
<= ZV
))
4904 args_out_of_range (start
, end
);
4906 if (NILP (coding_system
))
4908 /* Decide the coding-system to encode the data with.
4909 See fileio.c:Fwrite-region */
4911 if (!NILP (Vcoding_system_for_write
))
4912 coding_system
= Vcoding_system_for_write
;
4915 bool force_raw_text
= 0;
4917 coding_system
= BVAR (XBUFFER (object
), buffer_file_coding_system
);
4918 if (NILP (coding_system
)
4919 || NILP (Flocal_variable_p (Qbuffer_file_coding_system
, Qnil
)))
4921 coding_system
= Qnil
;
4922 if (NILP (BVAR (current_buffer
, enable_multibyte_characters
)))
4926 if (NILP (coding_system
) && !NILP (Fbuffer_file_name (object
)))
4928 /* Check file-coding-system-alist. */
4929 Lisp_Object args
[4], val
;
4931 args
[0] = Qwrite_region
; args
[1] = start
; args
[2] = end
;
4932 args
[3] = Fbuffer_file_name (object
);
4933 val
= Ffind_operation_coding_system (4, args
);
4934 if (CONSP (val
) && !NILP (XCDR (val
)))
4935 coding_system
= XCDR (val
);
4938 if (NILP (coding_system
)
4939 && !NILP (BVAR (XBUFFER (object
), buffer_file_coding_system
)))
4941 /* If we still have not decided a coding system, use the
4942 default value of buffer-file-coding-system. */
4943 coding_system
= BVAR (XBUFFER (object
), buffer_file_coding_system
);
4947 && !NILP (Ffboundp (Vselect_safe_coding_system_function
)))
4948 /* Confirm that VAL can surely encode the current region. */
4949 coding_system
= call4 (Vselect_safe_coding_system_function
,
4950 make_number (b
), make_number (e
),
4951 coding_system
, Qnil
);
4954 coding_system
= Qraw_text
;
4957 if (NILP (Fcoding_system_p (coding_system
)))
4959 /* Invalid coding system. */
4961 if (!NILP (noerror
))
4962 coding_system
= Qraw_text
;
4964 xsignal1 (Qcoding_system_error
, coding_system
);
4968 object
= make_buffer_string (b
, e
, 0);
4969 set_buffer_internal (prev
);
4970 /* Discard the unwind protect for recovering the current
4974 if (STRING_MULTIBYTE (object
))
4975 object
= code_convert_string (object
, coding_system
, Qnil
, 1, 0, 0);
4977 end_byte
= SBYTES (object
);
4980 if (EQ (algorithm
, Qmd5
))
4982 digest_size
= MD5_DIGEST_SIZE
;
4983 hash_func
= md5_buffer
;
4985 else if (EQ (algorithm
, Qsha1
))
4987 digest_size
= SHA1_DIGEST_SIZE
;
4988 hash_func
= sha1_buffer
;
4990 else if (EQ (algorithm
, Qsha224
))
4992 digest_size
= SHA224_DIGEST_SIZE
;
4993 hash_func
= sha224_buffer
;
4995 else if (EQ (algorithm
, Qsha256
))
4997 digest_size
= SHA256_DIGEST_SIZE
;
4998 hash_func
= sha256_buffer
;
5000 else if (EQ (algorithm
, Qsha384
))
5002 digest_size
= SHA384_DIGEST_SIZE
;
5003 hash_func
= sha384_buffer
;
5005 else if (EQ (algorithm
, Qsha512
))
5007 digest_size
= SHA512_DIGEST_SIZE
;
5008 hash_func
= sha512_buffer
;
5011 error ("Invalid algorithm arg: %s", SDATA (Fsymbol_name (algorithm
)));
5013 /* allocate 2 x digest_size so that it can be re-used to hold the
5015 digest
= make_uninit_string (digest_size
* 2);
5017 hash_func (SSDATA (object
) + start_byte
,
5018 end_byte
- start_byte
,
5023 unsigned char *p
= SDATA (digest
);
5024 for (i
= digest_size
- 1; i
>= 0; i
--)
5026 static char const hexdigit
[16] = "0123456789abcdef";
5028 p
[2 * i
] = hexdigit
[p_i
>> 4];
5029 p
[2 * i
+ 1] = hexdigit
[p_i
& 0xf];
5034 return make_unibyte_string (SSDATA (digest
), digest_size
);
5037 DEFUN ("md5", Fmd5
, Smd5
, 1, 5, 0,
5038 doc
: /* Return MD5 message digest of OBJECT, a buffer or string.
5040 A message digest is a cryptographic checksum of a document, and the
5041 algorithm to calculate it is defined in RFC 1321.
5043 The two optional arguments START and END are character positions
5044 specifying for which part of OBJECT the message digest should be
5045 computed. If nil or omitted, the digest is computed for the whole
5048 The MD5 message digest is computed from the result of encoding the
5049 text in a coding system, not directly from the internal Emacs form of
5050 the text. The optional fourth argument CODING-SYSTEM specifies which
5051 coding system to encode the text with. It should be the same coding
5052 system that you used or will use when actually writing the text into a
5055 If CODING-SYSTEM is nil or omitted, the default depends on OBJECT. If
5056 OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
5057 system would be chosen by default for writing this text into a file.
5059 If OBJECT is a string, the most preferred coding system (see the
5060 command `prefer-coding-system') is used.
5062 If NOERROR is non-nil, silently assume the `raw-text' coding if the
5063 guesswork fails. Normally, an error is signaled in such case. */)
5064 (Lisp_Object object
, Lisp_Object start
, Lisp_Object end
, Lisp_Object coding_system
, Lisp_Object noerror
)
5066 return secure_hash (Qmd5
, object
, start
, end
, coding_system
, noerror
, Qnil
);
5069 DEFUN ("secure-hash", Fsecure_hash
, Ssecure_hash
, 2, 5, 0,
5070 doc
: /* Return the secure hash of OBJECT, a buffer or string.
5071 ALGORITHM is a symbol specifying the hash to use:
5072 md5, sha1, sha224, sha256, sha384 or sha512.
5074 The two optional arguments START and END are positions specifying for
5075 which part of OBJECT to compute the hash. If nil or omitted, uses the
5078 If BINARY is non-nil, returns a string in binary form. */)
5079 (Lisp_Object algorithm
, Lisp_Object object
, Lisp_Object start
, Lisp_Object end
, Lisp_Object binary
)
5081 return secure_hash (algorithm
, object
, start
, end
, Qnil
, Qnil
, binary
);
5087 DEFSYM (Qmd5
, "md5");
5088 DEFSYM (Qsha1
, "sha1");
5089 DEFSYM (Qsha224
, "sha224");
5090 DEFSYM (Qsha256
, "sha256");
5091 DEFSYM (Qsha384
, "sha384");
5092 DEFSYM (Qsha512
, "sha512");
5094 /* Hash table stuff. */
5095 DEFSYM (Qhash_table_p
, "hash-table-p");
5097 DEFSYM (Qeql
, "eql");
5098 DEFSYM (Qequal
, "equal");
5099 DEFSYM (QCtest
, ":test");
5100 DEFSYM (QCsize
, ":size");
5101 DEFSYM (QCrehash_size
, ":rehash-size");
5102 DEFSYM (QCrehash_threshold
, ":rehash-threshold");
5103 DEFSYM (QCweakness
, ":weakness");
5104 DEFSYM (Qkey
, "key");
5105 DEFSYM (Qvalue
, "value");
5106 DEFSYM (Qhash_table_test
, "hash-table-test");
5107 DEFSYM (Qkey_or_value
, "key-or-value");
5108 DEFSYM (Qkey_and_value
, "key-and-value");
5111 defsubr (&Smake_hash_table
);
5112 defsubr (&Scopy_hash_table
);
5113 defsubr (&Shash_table_count
);
5114 defsubr (&Shash_table_rehash_size
);
5115 defsubr (&Shash_table_rehash_threshold
);
5116 defsubr (&Shash_table_size
);
5117 defsubr (&Shash_table_test
);
5118 defsubr (&Shash_table_weakness
);
5119 defsubr (&Shash_table_p
);
5120 defsubr (&Sclrhash
);
5121 defsubr (&Sgethash
);
5122 defsubr (&Sputhash
);
5123 defsubr (&Sremhash
);
5124 defsubr (&Smaphash
);
5125 defsubr (&Sdefine_hash_table_test
);
5127 DEFSYM (Qstring_lessp
, "string-lessp");
5128 DEFSYM (Qstring_collate_lessp
, "string-collate-lessp");
5129 DEFSYM (Qstring_collate_equalp
, "string-collate-equalp");
5130 DEFSYM (Qprovide
, "provide");
5131 DEFSYM (Qrequire
, "require");
5132 DEFSYM (Qyes_or_no_p_history
, "yes-or-no-p-history");
5133 DEFSYM (Qcursor_in_echo_area
, "cursor-in-echo-area");
5134 DEFSYM (Qwidget_type
, "widget-type");
5136 staticpro (&string_char_byte_cache_string
);
5137 string_char_byte_cache_string
= Qnil
;
5139 require_nesting_list
= Qnil
;
5140 staticpro (&require_nesting_list
);
5142 Fset (Qyes_or_no_p_history
, Qnil
);
5144 DEFVAR_LISP ("features", Vfeatures
,
5145 doc
: /* A list of symbols which are the features of the executing Emacs.
5146 Used by `featurep' and `require', and altered by `provide'. */);
5147 Vfeatures
= list1 (intern_c_string ("emacs"));
5148 DEFSYM (Qsubfeatures
, "subfeatures");
5149 DEFSYM (Qfuncall
, "funcall");
5151 #ifdef HAVE_LANGINFO_CODESET
5152 DEFSYM (Qcodeset
, "codeset");
5153 DEFSYM (Qdays
, "days");
5154 DEFSYM (Qmonths
, "months");
5155 DEFSYM (Qpaper
, "paper");
5156 #endif /* HAVE_LANGINFO_CODESET */
5158 DEFVAR_BOOL ("use-dialog-box", use_dialog_box
,
5159 doc
: /* Non-nil means mouse commands use dialog boxes to ask questions.
5160 This applies to `y-or-n-p' and `yes-or-no-p' questions asked by commands
5161 invoked by mouse clicks and mouse menu items.
5163 On some platforms, file selection dialogs are also enabled if this is
5167 DEFVAR_BOOL ("use-file-dialog", use_file_dialog
,
5168 doc
: /* Non-nil means mouse commands use a file dialog to ask for files.
5169 This applies to commands from menus and tool bar buttons even when
5170 they are initiated from the keyboard. If `use-dialog-box' is nil,
5171 that disables the use of a file dialog, regardless of the value of
5173 use_file_dialog
= 1;
5175 defsubr (&Sidentity
);
5178 defsubr (&Ssafe_length
);
5179 defsubr (&Sstring_bytes
);
5180 defsubr (&Sstring_equal
);
5181 defsubr (&Scompare_strings
);
5182 defsubr (&Sstring_lessp
);
5183 defsubr (&Sstring_collate_lessp
);
5184 defsubr (&Sstring_collate_equalp
);
5187 defsubr (&Svconcat
);
5188 defsubr (&Scopy_sequence
);
5189 defsubr (&Sstring_make_multibyte
);
5190 defsubr (&Sstring_make_unibyte
);
5191 defsubr (&Sstring_as_multibyte
);
5192 defsubr (&Sstring_as_unibyte
);
5193 defsubr (&Sstring_to_multibyte
);
5194 defsubr (&Sstring_to_unibyte
);
5195 defsubr (&Scopy_alist
);
5196 defsubr (&Ssubstring
);
5197 defsubr (&Ssubstring_no_properties
);
5210 defsubr (&Snreverse
);
5211 defsubr (&Sreverse
);
5213 defsubr (&Splist_get
);
5215 defsubr (&Splist_put
);
5217 defsubr (&Slax_plist_get
);
5218 defsubr (&Slax_plist_put
);
5221 defsubr (&Sequal_including_properties
);
5222 defsubr (&Sfillarray
);
5223 defsubr (&Sclear_string
);
5227 defsubr (&Smapconcat
);
5228 defsubr (&Syes_or_no_p
);
5229 defsubr (&Sload_average
);
5230 defsubr (&Sfeaturep
);
5231 defsubr (&Srequire
);
5232 defsubr (&Sprovide
);
5233 defsubr (&Splist_member
);
5234 defsubr (&Swidget_put
);
5235 defsubr (&Swidget_get
);
5236 defsubr (&Swidget_apply
);
5237 defsubr (&Sbase64_encode_region
);
5238 defsubr (&Sbase64_decode_region
);
5239 defsubr (&Sbase64_encode_string
);
5240 defsubr (&Sbase64_decode_string
);
5242 defsubr (&Ssecure_hash
);
5243 defsubr (&Slocale_info
);
5245 hashtest_eq
.name
= Qeq
;
5246 hashtest_eq
.user_hash_function
= Qnil
;
5247 hashtest_eq
.user_cmp_function
= Qnil
;
5248 hashtest_eq
.cmpfn
= 0;
5249 hashtest_eq
.hashfn
= hashfn_eq
;
5251 hashtest_eql
.name
= Qeql
;
5252 hashtest_eql
.user_hash_function
= Qnil
;
5253 hashtest_eql
.user_cmp_function
= Qnil
;
5254 hashtest_eql
.cmpfn
= cmpfn_eql
;
5255 hashtest_eql
.hashfn
= hashfn_eql
;
5257 hashtest_equal
.name
= Qequal
;
5258 hashtest_equal
.user_hash_function
= Qnil
;
5259 hashtest_equal
.user_cmp_function
= Qnil
;
5260 hashtest_equal
.cmpfn
= cmpfn_equal
;
5261 hashtest_equal
.hashfn
= hashfn_equal
;