1 /* Random utility Lisp functions.
3 Copyright (C) 1985-1987, 1993-1995, 1997-2015 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 static void sort_vector_copy (Lisp_Object
, ptrdiff_t,
45 Lisp_Object
[restrict
], Lisp_Object
[restrict
]);
46 static bool internal_equal (Lisp_Object
, Lisp_Object
, int, bool, Lisp_Object
);
48 DEFUN ("identity", Fidentity
, Sidentity
, 1, 1, 0,
49 doc
: /* Return the argument unchanged. */
56 DEFUN ("random", Frandom
, Srandom
, 0, 1, 0,
57 doc
: /* Return a pseudo-random number.
58 All integers representable in Lisp, i.e. between `most-negative-fixnum'
59 and `most-positive-fixnum', inclusive, are equally likely.
61 With positive integer LIMIT, return random number in interval [0,LIMIT).
62 With argument t, set the random number seed from the current time and pid.
63 With a string argument, set the seed based on the string's contents.
64 Other values of LIMIT are ignored.
66 See Info node `(elisp)Random Numbers' for more details. */)
73 else if (STRINGP (limit
))
74 seed_random (SSDATA (limit
), SBYTES (limit
));
77 if (INTEGERP (limit
) && 0 < XINT (limit
))
80 /* Return the remainder, except reject the rare case where
81 get_random returns a number so close to INTMASK that the
82 remainder isn't random. */
83 EMACS_INT remainder
= val
% XINT (limit
);
84 if (val
- remainder
<= INTMASK
- XINT (limit
) + 1)
85 return make_number (remainder
);
88 return make_number (val
);
91 /* Heuristic on how many iterations of a tight loop can be safely done
92 before it's time to do a QUIT. This must be a power of 2. */
93 enum { QUIT_COUNT_HEURISTIC
= 1 << 16 };
95 /* Random data-structure functions. */
98 CHECK_LIST_END (Lisp_Object x
, Lisp_Object y
)
100 CHECK_TYPE (NILP (x
), Qlistp
, y
);
103 DEFUN ("length", Flength
, Slength
, 1, 1, 0,
104 doc
: /* Return the length of vector, list or string SEQUENCE.
105 A byte-code function object is also allowed.
106 If the string contains multibyte characters, this is not necessarily
107 the number of bytes in the string; it is the number of characters.
108 To get the number of bytes, use `string-bytes'. */)
109 (register Lisp_Object sequence
)
111 register Lisp_Object val
;
113 if (STRINGP (sequence
))
114 XSETFASTINT (val
, SCHARS (sequence
));
115 else if (VECTORP (sequence
))
116 XSETFASTINT (val
, ASIZE (sequence
));
117 else if (CHAR_TABLE_P (sequence
))
118 XSETFASTINT (val
, MAX_CHAR
);
119 else if (BOOL_VECTOR_P (sequence
))
120 XSETFASTINT (val
, bool_vector_size (sequence
));
121 else if (COMPILEDP (sequence
))
122 XSETFASTINT (val
, ASIZE (sequence
) & PSEUDOVECTOR_SIZE_MASK
);
123 else if (CONSP (sequence
))
130 if ((i
& (QUIT_COUNT_HEURISTIC
- 1)) == 0)
132 if (MOST_POSITIVE_FIXNUM
< i
)
133 error ("List too long");
136 sequence
= XCDR (sequence
);
138 while (CONSP (sequence
));
140 CHECK_LIST_END (sequence
, sequence
);
142 val
= make_number (i
);
144 else if (NILP (sequence
))
145 XSETFASTINT (val
, 0);
147 wrong_type_argument (Qsequencep
, sequence
);
152 DEFUN ("safe-length", Fsafe_length
, Ssafe_length
, 1, 1, 0,
153 doc
: /* Return the length of a list, but avoid error or infinite loop.
154 This function never gets an error. If LIST is not really a list,
155 it returns 0. If LIST is circular, it returns a finite value
156 which is at least the number of distinct elements. */)
159 Lisp_Object tail
, halftail
;
164 return make_number (0);
166 /* halftail is used to detect circular lists. */
167 for (tail
= halftail
= list
; ; )
172 if (EQ (tail
, halftail
))
175 if ((lolen
& 1) == 0)
177 halftail
= XCDR (halftail
);
178 if ((lolen
& (QUIT_COUNT_HEURISTIC
- 1)) == 0)
182 hilen
+= UINTMAX_MAX
+ 1.0;
187 /* If the length does not fit into a fixnum, return a float.
188 On all known practical machines this returns an upper bound on
190 return hilen
? make_float (hilen
+ lolen
) : make_fixnum_or_float (lolen
);
193 DEFUN ("string-bytes", Fstring_bytes
, Sstring_bytes
, 1, 1, 0,
194 doc
: /* Return the number of bytes in STRING.
195 If STRING is multibyte, this may be greater than the length of STRING. */)
198 CHECK_STRING (string
);
199 return make_number (SBYTES (string
));
202 DEFUN ("string-equal", Fstring_equal
, Sstring_equal
, 2, 2, 0,
203 doc
: /* Return t if two strings have identical contents.
204 Case is significant, but text properties are ignored.
205 Symbols are also allowed; their print names are used instead. */)
206 (register Lisp_Object s1
, Lisp_Object s2
)
209 s1
= SYMBOL_NAME (s1
);
211 s2
= SYMBOL_NAME (s2
);
215 if (SCHARS (s1
) != SCHARS (s2
)
216 || SBYTES (s1
) != SBYTES (s2
)
217 || memcmp (SDATA (s1
), SDATA (s2
), SBYTES (s1
)))
222 DEFUN ("compare-strings", Fcompare_strings
, Scompare_strings
, 6, 7, 0,
223 doc
: /* Compare the contents of two strings, converting to multibyte if needed.
224 The arguments START1, END1, START2, and END2, if non-nil, are
225 positions specifying which parts of STR1 or STR2 to compare. In
226 string STR1, compare the part between START1 (inclusive) and END1
227 \(exclusive). If START1 is nil, it defaults to 0, the beginning of
228 the string; if END1 is nil, it defaults to the length of the string.
229 Likewise, in string STR2, compare the part between START2 and END2.
230 Like in `substring', negative values are counted from the end.
232 The strings are compared by the numeric values of their characters.
233 For instance, STR1 is "less than" STR2 if its first differing
234 character has a smaller numeric value. If IGNORE-CASE is non-nil,
235 characters are converted to lower-case before comparing them. Unibyte
236 strings are converted to multibyte for comparison.
238 The value is t if the strings (or specified portions) match.
239 If string STR1 is less, the value is a negative number N;
240 - 1 - N is the number of characters that match at the beginning.
241 If string STR1 is greater, the value is a positive number N;
242 N - 1 is the number of characters that match at the beginning. */)
243 (Lisp_Object str1
, Lisp_Object start1
, Lisp_Object end1
, Lisp_Object str2
,
244 Lisp_Object start2
, Lisp_Object end2
, Lisp_Object ignore_case
)
246 ptrdiff_t from1
, to1
, from2
, to2
, i1
, i1_byte
, i2
, i2_byte
;
251 /* For backward compatibility, silently bring too-large positive end
252 values into range. */
253 if (INTEGERP (end1
) && SCHARS (str1
) < XINT (end1
))
254 end1
= make_number (SCHARS (str1
));
255 if (INTEGERP (end2
) && SCHARS (str2
) < XINT (end2
))
256 end2
= make_number (SCHARS (str2
));
258 validate_subarray (str1
, start1
, end1
, SCHARS (str1
), &from1
, &to1
);
259 validate_subarray (str2
, start2
, end2
, SCHARS (str2
), &from2
, &to2
);
264 i1_byte
= string_char_to_byte (str1
, i1
);
265 i2_byte
= string_char_to_byte (str2
, i2
);
267 while (i1
< to1
&& i2
< to2
)
269 /* When we find a mismatch, we must compare the
270 characters, not just the bytes. */
273 FETCH_STRING_CHAR_AS_MULTIBYTE_ADVANCE (c1
, str1
, i1
, i1_byte
);
274 FETCH_STRING_CHAR_AS_MULTIBYTE_ADVANCE (c2
, str2
, i2
, i2_byte
);
279 if (! NILP (ignore_case
))
281 c1
= XINT (Fupcase (make_number (c1
)));
282 c2
= XINT (Fupcase (make_number (c2
)));
288 /* Note that I1 has already been incremented
289 past the character that we are comparing;
290 hence we don't add or subtract 1 here. */
292 return make_number (- i1
+ from1
);
294 return make_number (i1
- from1
);
298 return make_number (i1
- from1
+ 1);
300 return make_number (- i1
+ from1
- 1);
305 DEFUN ("string-lessp", Fstring_lessp
, Sstring_lessp
, 2, 2, 0,
306 doc
: /* Return non-nil if STRING1 is less than STRING2 in lexicographic order.
308 Symbols are also allowed; their print names are used instead. */)
309 (register Lisp_Object string1
, Lisp_Object string2
)
311 register ptrdiff_t end
;
312 register ptrdiff_t i1
, i1_byte
, i2
, i2_byte
;
314 if (SYMBOLP (string1
))
315 string1
= SYMBOL_NAME (string1
);
316 if (SYMBOLP (string2
))
317 string2
= SYMBOL_NAME (string2
);
318 CHECK_STRING (string1
);
319 CHECK_STRING (string2
);
321 i1
= i1_byte
= i2
= i2_byte
= 0;
323 end
= SCHARS (string1
);
324 if (end
> SCHARS (string2
))
325 end
= SCHARS (string2
);
329 /* When we find a mismatch, we must compare the
330 characters, not just the bytes. */
333 FETCH_STRING_CHAR_ADVANCE (c1
, string1
, i1
, i1_byte
);
334 FETCH_STRING_CHAR_ADVANCE (c2
, string2
, i2
, i2_byte
);
337 return c1
< c2
? Qt
: Qnil
;
339 return i1
< SCHARS (string2
) ? Qt
: Qnil
;
342 DEFUN ("string-collate-lessp", Fstring_collate_lessp
, Sstring_collate_lessp
, 2, 4, 0,
343 doc
: /* Return t if first arg string is less than second in collation order.
344 Symbols are also allowed; their print names are used instead.
346 This function obeys the conventions for collation order in your
347 locale settings. For example, punctuation and whitespace characters
348 might be considered less significant for sorting:
350 \(sort '\("11" "12" "1 1" "1 2" "1.1" "1.2") 'string-collate-lessp)
351 => \("11" "1 1" "1.1" "12" "1 2" "1.2")
353 The optional argument LOCALE, a string, overrides the setting of your
354 current locale identifier for collation. The value is system
355 dependent; a LOCALE \"en_US.UTF-8\" is applicable on POSIX systems,
356 while it would be, e.g., \"enu_USA.1252\" on MS-Windows systems.
358 If IGNORE-CASE is non-nil, characters are converted to lower-case
359 before comparing them.
361 To emulate Unicode-compliant collation on MS-Windows systems,
362 bind `w32-collate-ignore-punctuation' to a non-nil value, since
363 the codeset part of the locale cannot be \"UTF-8\" on MS-Windows.
365 If your system does not support a locale environment, this function
366 behaves like `string-lessp'. */)
367 (Lisp_Object s1
, Lisp_Object s2
, Lisp_Object locale
, Lisp_Object ignore_case
)
369 #if defined __STDC_ISO_10646__ || defined WINDOWSNT
370 /* Check parameters. */
372 s1
= SYMBOL_NAME (s1
);
374 s2
= SYMBOL_NAME (s2
);
378 CHECK_STRING (locale
);
380 return (str_collate (s1
, s2
, locale
, ignore_case
) < 0) ? Qt
: Qnil
;
382 #else /* !__STDC_ISO_10646__, !WINDOWSNT */
383 return Fstring_lessp (s1
, s2
);
384 #endif /* !__STDC_ISO_10646__, !WINDOWSNT */
387 DEFUN ("string-collate-equalp", Fstring_collate_equalp
, Sstring_collate_equalp
, 2, 4, 0,
388 doc
: /* Return t if two strings have identical contents.
389 Symbols are also allowed; their print names are used instead.
391 This function obeys the conventions for collation order in your locale
392 settings. For example, characters with different coding points but
393 the same meaning might be considered as equal, like different grave
394 accent Unicode characters:
396 \(string-collate-equalp \(string ?\\uFF40) \(string ?\\u1FEF))
399 The optional argument LOCALE, a string, overrides the setting of your
400 current locale identifier for collation. The value is system
401 dependent; a LOCALE \"en_US.UTF-8\" is applicable on POSIX systems,
402 while it would be \"enu_USA.1252\" on MS Windows systems.
404 If IGNORE-CASE is non-nil, characters are converted to lower-case
405 before comparing them.
407 To emulate Unicode-compliant collation on MS-Windows systems,
408 bind `w32-collate-ignore-punctuation' to a non-nil value, since
409 the codeset part of the locale cannot be \"UTF-8\" on MS-Windows.
411 If your system does not support a locale environment, this function
412 behaves like `string-equal'.
414 Do NOT use this function to compare file names for equality, only
415 for sorting them. */)
416 (Lisp_Object s1
, Lisp_Object s2
, Lisp_Object locale
, Lisp_Object ignore_case
)
418 #if defined __STDC_ISO_10646__ || defined WINDOWSNT
419 /* Check parameters. */
421 s1
= SYMBOL_NAME (s1
);
423 s2
= SYMBOL_NAME (s2
);
427 CHECK_STRING (locale
);
429 return (str_collate (s1
, s2
, locale
, ignore_case
) == 0) ? Qt
: Qnil
;
431 #else /* !__STDC_ISO_10646__, !WINDOWSNT */
432 return Fstring_equal (s1
, s2
);
433 #endif /* !__STDC_ISO_10646__, !WINDOWSNT */
436 static Lisp_Object
concat (ptrdiff_t nargs
, Lisp_Object
*args
,
437 enum Lisp_Type target_type
, bool last_special
);
441 concat2 (Lisp_Object s1
, Lisp_Object s2
)
443 return concat (2, ((Lisp_Object
[]) {s1
, s2
}), Lisp_String
, 0);
448 concat3 (Lisp_Object s1
, Lisp_Object s2
, Lisp_Object s3
)
450 return concat (3, ((Lisp_Object
[]) {s1
, s2
, s3
}), Lisp_String
, 0);
453 DEFUN ("append", Fappend
, Sappend
, 0, MANY
, 0,
454 doc
: /* Concatenate all the arguments and make the result a list.
455 The result is a list whose elements are the elements of all the arguments.
456 Each argument may be a list, vector or string.
457 The last argument is not copied, just used as the tail of the new list.
458 usage: (append &rest SEQUENCES) */)
459 (ptrdiff_t nargs
, Lisp_Object
*args
)
461 return concat (nargs
, args
, Lisp_Cons
, 1);
464 DEFUN ("concat", Fconcat
, Sconcat
, 0, MANY
, 0,
465 doc
: /* Concatenate all the arguments and make the result a string.
466 The result is a string whose elements are the elements of all the arguments.
467 Each argument may be a string or a list or vector of characters (integers).
468 usage: (concat &rest SEQUENCES) */)
469 (ptrdiff_t nargs
, Lisp_Object
*args
)
471 return concat (nargs
, args
, Lisp_String
, 0);
474 DEFUN ("vconcat", Fvconcat
, Svconcat
, 0, MANY
, 0,
475 doc
: /* Concatenate all the arguments and make the result a vector.
476 The result is a vector whose elements are the elements of all the arguments.
477 Each argument may be a list, vector or string.
478 usage: (vconcat &rest SEQUENCES) */)
479 (ptrdiff_t nargs
, Lisp_Object
*args
)
481 return concat (nargs
, args
, Lisp_Vectorlike
, 0);
485 DEFUN ("copy-sequence", Fcopy_sequence
, Scopy_sequence
, 1, 1, 0,
486 doc
: /* Return a copy of a list, vector, string or char-table.
487 The elements of a list or vector are not copied; they are shared
488 with the original. */)
491 if (NILP (arg
)) return arg
;
493 if (CHAR_TABLE_P (arg
))
495 return copy_char_table (arg
);
498 if (BOOL_VECTOR_P (arg
))
500 EMACS_INT nbits
= bool_vector_size (arg
);
501 ptrdiff_t nbytes
= bool_vector_bytes (nbits
);
502 Lisp_Object val
= make_uninit_bool_vector (nbits
);
503 memcpy (bool_vector_data (val
), bool_vector_data (arg
), nbytes
);
507 if (!CONSP (arg
) && !VECTORP (arg
) && !STRINGP (arg
))
508 wrong_type_argument (Qsequencep
, arg
);
510 return concat (1, &arg
, XTYPE (arg
), 0);
513 /* This structure holds information of an argument of `concat' that is
514 a string and has text properties to be copied. */
517 ptrdiff_t argnum
; /* refer to ARGS (arguments of `concat') */
518 ptrdiff_t from
; /* refer to ARGS[argnum] (argument string) */
519 ptrdiff_t to
; /* refer to VAL (the target string) */
523 concat (ptrdiff_t nargs
, Lisp_Object
*args
,
524 enum Lisp_Type target_type
, bool last_special
)
530 ptrdiff_t toindex_byte
= 0;
531 EMACS_INT result_len
;
532 EMACS_INT result_len_byte
;
534 Lisp_Object last_tail
;
537 /* When we make a multibyte string, we can't copy text properties
538 while concatenating each string because the length of resulting
539 string can't be decided until we finish the whole concatenation.
540 So, we record strings that have text properties to be copied
541 here, and copy the text properties after the concatenation. */
542 struct textprop_rec
*textprops
= NULL
;
543 /* Number of elements in textprops. */
544 ptrdiff_t num_textprops
= 0;
549 /* In append, the last arg isn't treated like the others */
550 if (last_special
&& nargs
> 0)
553 last_tail
= args
[nargs
];
558 /* Check each argument. */
559 for (argnum
= 0; argnum
< nargs
; argnum
++)
562 if (!(CONSP (this) || NILP (this) || VECTORP (this) || STRINGP (this)
563 || COMPILEDP (this) || BOOL_VECTOR_P (this)))
564 wrong_type_argument (Qsequencep
, this);
567 /* Compute total length in chars of arguments in RESULT_LEN.
568 If desired output is a string, also compute length in bytes
569 in RESULT_LEN_BYTE, and determine in SOME_MULTIBYTE
570 whether the result should be a multibyte string. */
574 for (argnum
= 0; argnum
< nargs
; argnum
++)
578 len
= XFASTINT (Flength (this));
579 if (target_type
== Lisp_String
)
581 /* We must count the number of bytes needed in the string
582 as well as the number of characters. */
586 ptrdiff_t this_len_byte
;
588 if (VECTORP (this) || COMPILEDP (this))
589 for (i
= 0; i
< len
; i
++)
592 CHECK_CHARACTER (ch
);
594 this_len_byte
= CHAR_BYTES (c
);
595 if (STRING_BYTES_BOUND
- result_len_byte
< this_len_byte
)
597 result_len_byte
+= this_len_byte
;
598 if (! ASCII_CHAR_P (c
) && ! CHAR_BYTE8_P (c
))
601 else if (BOOL_VECTOR_P (this) && bool_vector_size (this) > 0)
602 wrong_type_argument (Qintegerp
, Faref (this, make_number (0)));
603 else if (CONSP (this))
604 for (; CONSP (this); this = XCDR (this))
607 CHECK_CHARACTER (ch
);
609 this_len_byte
= CHAR_BYTES (c
);
610 if (STRING_BYTES_BOUND
- result_len_byte
< this_len_byte
)
612 result_len_byte
+= this_len_byte
;
613 if (! ASCII_CHAR_P (c
) && ! CHAR_BYTE8_P (c
))
616 else if (STRINGP (this))
618 if (STRING_MULTIBYTE (this))
621 this_len_byte
= SBYTES (this);
624 this_len_byte
= count_size_as_multibyte (SDATA (this),
626 if (STRING_BYTES_BOUND
- result_len_byte
< this_len_byte
)
628 result_len_byte
+= this_len_byte
;
633 if (MOST_POSITIVE_FIXNUM
< result_len
)
634 memory_full (SIZE_MAX
);
637 if (! some_multibyte
)
638 result_len_byte
= result_len
;
640 /* Create the output object. */
641 if (target_type
== Lisp_Cons
)
642 val
= Fmake_list (make_number (result_len
), Qnil
);
643 else if (target_type
== Lisp_Vectorlike
)
644 val
= Fmake_vector (make_number (result_len
), Qnil
);
645 else if (some_multibyte
)
646 val
= make_uninit_multibyte_string (result_len
, result_len_byte
);
648 val
= make_uninit_string (result_len
);
650 /* In `append', if all but last arg are nil, return last arg. */
651 if (target_type
== Lisp_Cons
&& EQ (val
, Qnil
))
654 /* Copy the contents of the args into the result. */
656 tail
= val
, toindex
= -1; /* -1 in toindex is flag we are making a list */
658 toindex
= 0, toindex_byte
= 0;
662 SAFE_NALLOCA (textprops
, 1, nargs
);
664 for (argnum
= 0; argnum
< nargs
; argnum
++)
667 ptrdiff_t thisleni
= 0;
668 register ptrdiff_t thisindex
= 0;
669 register ptrdiff_t thisindex_byte
= 0;
673 thislen
= Flength (this), thisleni
= XINT (thislen
);
675 /* Between strings of the same kind, copy fast. */
676 if (STRINGP (this) && STRINGP (val
)
677 && STRING_MULTIBYTE (this) == some_multibyte
)
679 ptrdiff_t thislen_byte
= SBYTES (this);
681 memcpy (SDATA (val
) + toindex_byte
, SDATA (this), SBYTES (this));
682 if (string_intervals (this))
684 textprops
[num_textprops
].argnum
= argnum
;
685 textprops
[num_textprops
].from
= 0;
686 textprops
[num_textprops
++].to
= toindex
;
688 toindex_byte
+= thislen_byte
;
691 /* Copy a single-byte string to a multibyte string. */
692 else if (STRINGP (this) && STRINGP (val
))
694 if (string_intervals (this))
696 textprops
[num_textprops
].argnum
= argnum
;
697 textprops
[num_textprops
].from
= 0;
698 textprops
[num_textprops
++].to
= toindex
;
700 toindex_byte
+= copy_text (SDATA (this),
701 SDATA (val
) + toindex_byte
,
702 SCHARS (this), 0, 1);
706 /* Copy element by element. */
709 register Lisp_Object elt
;
711 /* Fetch next element of `this' arg into `elt', or break if
712 `this' is exhausted. */
713 if (NILP (this)) break;
715 elt
= XCAR (this), this = XCDR (this);
716 else if (thisindex
>= thisleni
)
718 else if (STRINGP (this))
721 if (STRING_MULTIBYTE (this))
722 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, this,
727 c
= SREF (this, thisindex
); thisindex
++;
728 if (some_multibyte
&& !ASCII_CHAR_P (c
))
729 c
= BYTE8_TO_CHAR (c
);
731 XSETFASTINT (elt
, c
);
733 else if (BOOL_VECTOR_P (this))
735 elt
= bool_vector_ref (this, thisindex
);
740 elt
= AREF (this, thisindex
);
744 /* Store this element into the result. */
751 else if (VECTORP (val
))
753 ASET (val
, toindex
, elt
);
759 CHECK_CHARACTER (elt
);
762 toindex_byte
+= CHAR_STRING (c
, SDATA (val
) + toindex_byte
);
764 SSET (val
, toindex_byte
++, c
);
770 XSETCDR (prev
, last_tail
);
772 if (num_textprops
> 0)
775 ptrdiff_t last_to_end
= -1;
777 for (argnum
= 0; argnum
< num_textprops
; argnum
++)
779 this = args
[textprops
[argnum
].argnum
];
780 props
= text_property_list (this,
782 make_number (SCHARS (this)),
784 /* If successive arguments have properties, be sure that the
785 value of `composition' property be the copy. */
786 if (last_to_end
== textprops
[argnum
].to
)
787 make_composition_value_copy (props
);
788 add_text_properties_from_list (val
, props
,
789 make_number (textprops
[argnum
].to
));
790 last_to_end
= textprops
[argnum
].to
+ SCHARS (this);
798 static Lisp_Object string_char_byte_cache_string
;
799 static ptrdiff_t string_char_byte_cache_charpos
;
800 static ptrdiff_t string_char_byte_cache_bytepos
;
803 clear_string_char_byte_cache (void)
805 string_char_byte_cache_string
= Qnil
;
808 /* Return the byte index corresponding to CHAR_INDEX in STRING. */
811 string_char_to_byte (Lisp_Object string
, ptrdiff_t char_index
)
814 ptrdiff_t best_below
, best_below_byte
;
815 ptrdiff_t best_above
, best_above_byte
;
817 best_below
= best_below_byte
= 0;
818 best_above
= SCHARS (string
);
819 best_above_byte
= SBYTES (string
);
820 if (best_above
== best_above_byte
)
823 if (EQ (string
, string_char_byte_cache_string
))
825 if (string_char_byte_cache_charpos
< char_index
)
827 best_below
= string_char_byte_cache_charpos
;
828 best_below_byte
= string_char_byte_cache_bytepos
;
832 best_above
= string_char_byte_cache_charpos
;
833 best_above_byte
= string_char_byte_cache_bytepos
;
837 if (char_index
- best_below
< best_above
- char_index
)
839 unsigned char *p
= SDATA (string
) + best_below_byte
;
841 while (best_below
< char_index
)
843 p
+= BYTES_BY_CHAR_HEAD (*p
);
846 i_byte
= p
- SDATA (string
);
850 unsigned char *p
= SDATA (string
) + best_above_byte
;
852 while (best_above
> char_index
)
855 while (!CHAR_HEAD_P (*p
)) p
--;
858 i_byte
= p
- SDATA (string
);
861 string_char_byte_cache_bytepos
= i_byte
;
862 string_char_byte_cache_charpos
= char_index
;
863 string_char_byte_cache_string
= string
;
868 /* Return the character index corresponding to BYTE_INDEX in STRING. */
871 string_byte_to_char (Lisp_Object string
, ptrdiff_t byte_index
)
874 ptrdiff_t best_below
, best_below_byte
;
875 ptrdiff_t best_above
, best_above_byte
;
877 best_below
= best_below_byte
= 0;
878 best_above
= SCHARS (string
);
879 best_above_byte
= SBYTES (string
);
880 if (best_above
== best_above_byte
)
883 if (EQ (string
, string_char_byte_cache_string
))
885 if (string_char_byte_cache_bytepos
< byte_index
)
887 best_below
= string_char_byte_cache_charpos
;
888 best_below_byte
= string_char_byte_cache_bytepos
;
892 best_above
= string_char_byte_cache_charpos
;
893 best_above_byte
= string_char_byte_cache_bytepos
;
897 if (byte_index
- best_below_byte
< best_above_byte
- byte_index
)
899 unsigned char *p
= SDATA (string
) + best_below_byte
;
900 unsigned char *pend
= SDATA (string
) + byte_index
;
904 p
+= BYTES_BY_CHAR_HEAD (*p
);
908 i_byte
= p
- SDATA (string
);
912 unsigned char *p
= SDATA (string
) + best_above_byte
;
913 unsigned char *pbeg
= SDATA (string
) + byte_index
;
918 while (!CHAR_HEAD_P (*p
)) p
--;
922 i_byte
= p
- SDATA (string
);
925 string_char_byte_cache_bytepos
= i_byte
;
926 string_char_byte_cache_charpos
= i
;
927 string_char_byte_cache_string
= string
;
932 /* Convert STRING to a multibyte string. */
935 string_make_multibyte (Lisp_Object string
)
942 if (STRING_MULTIBYTE (string
))
945 nbytes
= count_size_as_multibyte (SDATA (string
),
947 /* If all the chars are ASCII, they won't need any more bytes
948 once converted. In that case, we can return STRING itself. */
949 if (nbytes
== SBYTES (string
))
952 buf
= SAFE_ALLOCA (nbytes
);
953 copy_text (SDATA (string
), buf
, SBYTES (string
),
956 ret
= make_multibyte_string ((char *) buf
, SCHARS (string
), nbytes
);
963 /* Convert STRING (if unibyte) to a multibyte string without changing
964 the number of characters. Characters 0200 trough 0237 are
965 converted to eight-bit characters. */
968 string_to_multibyte (Lisp_Object string
)
975 if (STRING_MULTIBYTE (string
))
978 nbytes
= count_size_as_multibyte (SDATA (string
), SBYTES (string
));
979 /* If all the chars are ASCII, they won't need any more bytes once
981 if (nbytes
== SBYTES (string
))
982 return make_multibyte_string (SSDATA (string
), nbytes
, nbytes
);
984 buf
= SAFE_ALLOCA (nbytes
);
985 memcpy (buf
, SDATA (string
), SBYTES (string
));
986 str_to_multibyte (buf
, nbytes
, SBYTES (string
));
988 ret
= make_multibyte_string ((char *) buf
, SCHARS (string
), nbytes
);
995 /* Convert STRING to a single-byte string. */
998 string_make_unibyte (Lisp_Object string
)
1005 if (! STRING_MULTIBYTE (string
))
1008 nchars
= SCHARS (string
);
1010 buf
= SAFE_ALLOCA (nchars
);
1011 copy_text (SDATA (string
), buf
, SBYTES (string
),
1014 ret
= make_unibyte_string ((char *) buf
, nchars
);
1020 DEFUN ("string-make-multibyte", Fstring_make_multibyte
, Sstring_make_multibyte
,
1022 doc
: /* Return the multibyte equivalent of STRING.
1023 If STRING is unibyte and contains non-ASCII characters, the function
1024 `unibyte-char-to-multibyte' is used to convert each unibyte character
1025 to a multibyte character. In this case, the returned string is a
1026 newly created string with no text properties. If STRING is multibyte
1027 or entirely ASCII, it is returned unchanged. In particular, when
1028 STRING is unibyte and entirely ASCII, the returned string is unibyte.
1029 \(When the characters are all ASCII, Emacs primitives will treat the
1030 string the same way whether it is unibyte or multibyte.) */)
1031 (Lisp_Object string
)
1033 CHECK_STRING (string
);
1035 return string_make_multibyte (string
);
1038 DEFUN ("string-make-unibyte", Fstring_make_unibyte
, Sstring_make_unibyte
,
1040 doc
: /* Return the unibyte equivalent of STRING.
1041 Multibyte character codes are converted to unibyte according to
1042 `nonascii-translation-table' or, if that is nil, `nonascii-insert-offset'.
1043 If the lookup in the translation table fails, this function takes just
1044 the low 8 bits of each character. */)
1045 (Lisp_Object string
)
1047 CHECK_STRING (string
);
1049 return string_make_unibyte (string
);
1052 DEFUN ("string-as-unibyte", Fstring_as_unibyte
, Sstring_as_unibyte
,
1054 doc
: /* Return a unibyte string with the same individual bytes as STRING.
1055 If STRING is unibyte, the result is STRING itself.
1056 Otherwise it is a newly created string, with no text properties.
1057 If STRING is multibyte and contains a character of charset
1058 `eight-bit', it is converted to the corresponding single byte. */)
1059 (Lisp_Object string
)
1061 CHECK_STRING (string
);
1063 if (STRING_MULTIBYTE (string
))
1065 unsigned char *str
= (unsigned char *) xlispstrdup (string
);
1066 ptrdiff_t bytes
= str_as_unibyte (str
, SBYTES (string
));
1068 string
= make_unibyte_string ((char *) str
, bytes
);
1074 DEFUN ("string-as-multibyte", Fstring_as_multibyte
, Sstring_as_multibyte
,
1076 doc
: /* Return a multibyte string with the same individual bytes as STRING.
1077 If STRING is multibyte, the result is STRING itself.
1078 Otherwise it is a newly created string, with no text properties.
1080 If STRING is unibyte and contains an individual 8-bit byte (i.e. not
1081 part of a correct utf-8 sequence), it is converted to the corresponding
1082 multibyte character of charset `eight-bit'.
1083 See also `string-to-multibyte'.
1085 Beware, this often doesn't really do what you think it does.
1086 It is similar to (decode-coding-string STRING 'utf-8-emacs).
1087 If you're not sure, whether to use `string-as-multibyte' or
1088 `string-to-multibyte', use `string-to-multibyte'. */)
1089 (Lisp_Object string
)
1091 CHECK_STRING (string
);
1093 if (! STRING_MULTIBYTE (string
))
1095 Lisp_Object new_string
;
1096 ptrdiff_t nchars
, nbytes
;
1098 parse_str_as_multibyte (SDATA (string
),
1101 new_string
= make_uninit_multibyte_string (nchars
, nbytes
);
1102 memcpy (SDATA (new_string
), SDATA (string
), SBYTES (string
));
1103 if (nbytes
!= SBYTES (string
))
1104 str_as_multibyte (SDATA (new_string
), nbytes
,
1105 SBYTES (string
), NULL
);
1106 string
= new_string
;
1107 set_string_intervals (string
, NULL
);
1112 DEFUN ("string-to-multibyte", Fstring_to_multibyte
, Sstring_to_multibyte
,
1114 doc
: /* Return a multibyte string with the same individual chars as STRING.
1115 If STRING is multibyte, the result is STRING itself.
1116 Otherwise it is a newly created string, with no text properties.
1118 If STRING is unibyte and contains an 8-bit byte, it is converted to
1119 the corresponding multibyte character of charset `eight-bit'.
1121 This differs from `string-as-multibyte' by converting each byte of a correct
1122 utf-8 sequence to an eight-bit character, not just bytes that don't form a
1123 correct sequence. */)
1124 (Lisp_Object string
)
1126 CHECK_STRING (string
);
1128 return string_to_multibyte (string
);
1131 DEFUN ("string-to-unibyte", Fstring_to_unibyte
, Sstring_to_unibyte
,
1133 doc
: /* Return a unibyte string with the same individual chars as STRING.
1134 If STRING is unibyte, the result is STRING itself.
1135 Otherwise it is a newly created string, with no text properties,
1136 where each `eight-bit' character is converted to the corresponding byte.
1137 If STRING contains a non-ASCII, non-`eight-bit' character,
1138 an error is signaled. */)
1139 (Lisp_Object string
)
1141 CHECK_STRING (string
);
1143 if (STRING_MULTIBYTE (string
))
1145 ptrdiff_t chars
= SCHARS (string
);
1146 unsigned char *str
= xmalloc (chars
);
1147 ptrdiff_t converted
= str_to_unibyte (SDATA (string
), str
, chars
);
1149 if (converted
< chars
)
1150 error ("Can't convert the %"pD
"dth character to unibyte", converted
);
1151 string
= make_unibyte_string ((char *) str
, chars
);
1158 DEFUN ("copy-alist", Fcopy_alist
, Scopy_alist
, 1, 1, 0,
1159 doc
: /* Return a copy of ALIST.
1160 This is an alist which represents the same mapping from objects to objects,
1161 but does not share the alist structure with ALIST.
1162 The objects mapped (cars and cdrs of elements of the alist)
1163 are shared, however.
1164 Elements of ALIST that are not conses are also shared. */)
1167 register Lisp_Object tem
;
1172 alist
= concat (1, &alist
, Lisp_Cons
, 0);
1173 for (tem
= alist
; CONSP (tem
); tem
= XCDR (tem
))
1175 register Lisp_Object car
;
1179 XSETCAR (tem
, Fcons (XCAR (car
), XCDR (car
)));
1184 /* Check that ARRAY can have a valid subarray [FROM..TO),
1185 given that its size is SIZE.
1186 If FROM is nil, use 0; if TO is nil, use SIZE.
1187 Count negative values backwards from the end.
1188 Set *IFROM and *ITO to the two indexes used. */
1191 validate_subarray (Lisp_Object array
, Lisp_Object from
, Lisp_Object to
,
1192 ptrdiff_t size
, ptrdiff_t *ifrom
, ptrdiff_t *ito
)
1196 if (INTEGERP (from
))
1202 else if (NILP (from
))
1205 wrong_type_argument (Qintegerp
, from
);
1216 wrong_type_argument (Qintegerp
, to
);
1218 if (! (0 <= f
&& f
<= t
&& t
<= size
))
1219 args_out_of_range_3 (array
, from
, to
);
1225 DEFUN ("substring", Fsubstring
, Ssubstring
, 1, 3, 0,
1226 doc
: /* Return a new string whose contents are a substring of STRING.
1227 The returned string consists of the characters between index FROM
1228 \(inclusive) and index TO (exclusive) of STRING. FROM and TO are
1229 zero-indexed: 0 means the first character of STRING. Negative values
1230 are counted from the end of STRING. If TO is nil, the substring runs
1231 to the end of STRING.
1233 The STRING argument may also be a vector. In that case, the return
1234 value is a new vector that contains the elements between index FROM
1235 \(inclusive) and index TO (exclusive) of that vector argument.
1237 With one argument, just copy STRING (with properties, if any). */)
1238 (Lisp_Object string
, Lisp_Object from
, Lisp_Object to
)
1241 ptrdiff_t size
, ifrom
, ito
;
1243 size
= CHECK_VECTOR_OR_STRING (string
);
1244 validate_subarray (string
, from
, to
, size
, &ifrom
, &ito
);
1246 if (STRINGP (string
))
1249 = !ifrom
? 0 : string_char_to_byte (string
, ifrom
);
1251 = ito
== size
? SBYTES (string
) : string_char_to_byte (string
, ito
);
1252 res
= make_specified_string (SSDATA (string
) + from_byte
,
1253 ito
- ifrom
, to_byte
- from_byte
,
1254 STRING_MULTIBYTE (string
));
1255 copy_text_properties (make_number (ifrom
), make_number (ito
),
1256 string
, make_number (0), res
, Qnil
);
1259 res
= Fvector (ito
- ifrom
, aref_addr (string
, ifrom
));
1265 DEFUN ("substring-no-properties", Fsubstring_no_properties
, Ssubstring_no_properties
, 1, 3, 0,
1266 doc
: /* Return a substring of STRING, without text properties.
1267 It starts at index FROM and ends before TO.
1268 TO may be nil or omitted; then the substring runs to the end of STRING.
1269 If FROM is nil or omitted, the substring starts at the beginning of STRING.
1270 If FROM or TO is negative, it counts from the end.
1272 With one argument, just copy STRING without its properties. */)
1273 (Lisp_Object string
, register Lisp_Object from
, Lisp_Object to
)
1275 ptrdiff_t from_char
, to_char
, from_byte
, to_byte
, size
;
1277 CHECK_STRING (string
);
1279 size
= SCHARS (string
);
1280 validate_subarray (string
, from
, to
, size
, &from_char
, &to_char
);
1282 from_byte
= !from_char
? 0 : string_char_to_byte (string
, from_char
);
1284 to_char
== size
? SBYTES (string
) : string_char_to_byte (string
, to_char
);
1285 return make_specified_string (SSDATA (string
) + from_byte
,
1286 to_char
- from_char
, to_byte
- from_byte
,
1287 STRING_MULTIBYTE (string
));
1290 /* Extract a substring of STRING, giving start and end positions
1291 both in characters and in bytes. */
1294 substring_both (Lisp_Object string
, ptrdiff_t from
, ptrdiff_t from_byte
,
1295 ptrdiff_t to
, ptrdiff_t to_byte
)
1298 ptrdiff_t size
= CHECK_VECTOR_OR_STRING (string
);
1300 if (!(0 <= from
&& from
<= to
&& to
<= size
))
1301 args_out_of_range_3 (string
, make_number (from
), make_number (to
));
1303 if (STRINGP (string
))
1305 res
= make_specified_string (SSDATA (string
) + from_byte
,
1306 to
- from
, to_byte
- from_byte
,
1307 STRING_MULTIBYTE (string
));
1308 copy_text_properties (make_number (from
), make_number (to
),
1309 string
, make_number (0), res
, Qnil
);
1312 res
= Fvector (to
- from
, aref_addr (string
, from
));
1317 DEFUN ("nthcdr", Fnthcdr
, Snthcdr
, 2, 2, 0,
1318 doc
: /* Take cdr N times on LIST, return the result. */)
1319 (Lisp_Object n
, Lisp_Object list
)
1324 for (i
= 0; i
< num
&& !NILP (list
); i
++)
1327 CHECK_LIST_CONS (list
, list
);
1333 DEFUN ("nth", Fnth
, Snth
, 2, 2, 0,
1334 doc
: /* Return the Nth element of LIST.
1335 N counts from zero. If LIST is not that long, nil is returned. */)
1336 (Lisp_Object n
, Lisp_Object list
)
1338 return Fcar (Fnthcdr (n
, list
));
1341 DEFUN ("elt", Felt
, Selt
, 2, 2, 0,
1342 doc
: /* Return element of SEQUENCE at index N. */)
1343 (register Lisp_Object sequence
, Lisp_Object n
)
1346 if (CONSP (sequence
) || NILP (sequence
))
1347 return Fcar (Fnthcdr (n
, sequence
));
1349 /* Faref signals a "not array" error, so check here. */
1350 CHECK_ARRAY (sequence
, Qsequencep
);
1351 return Faref (sequence
, n
);
1354 DEFUN ("member", Fmember
, Smember
, 2, 2, 0,
1355 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'.
1356 The value is actually the tail of LIST whose car is ELT. */)
1357 (register Lisp_Object elt
, Lisp_Object list
)
1359 register Lisp_Object tail
;
1360 for (tail
= list
; CONSP (tail
); tail
= XCDR (tail
))
1362 register Lisp_Object tem
;
1363 CHECK_LIST_CONS (tail
, list
);
1365 if (! NILP (Fequal (elt
, tem
)))
1372 DEFUN ("memq", Fmemq
, Smemq
, 2, 2, 0,
1373 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `eq'.
1374 The value is actually the tail of LIST whose car is ELT. */)
1375 (register Lisp_Object elt
, Lisp_Object list
)
1379 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1383 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1387 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1398 DEFUN ("memql", Fmemql
, Smemql
, 2, 2, 0,
1399 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `eql'.
1400 The value is actually the tail of LIST whose car is ELT. */)
1401 (register Lisp_Object elt
, Lisp_Object list
)
1403 register Lisp_Object tail
;
1406 return Fmemq (elt
, list
);
1408 for (tail
= list
; CONSP (tail
); tail
= XCDR (tail
))
1410 register Lisp_Object tem
;
1411 CHECK_LIST_CONS (tail
, list
);
1413 if (FLOATP (tem
) && internal_equal (elt
, tem
, 0, 0, Qnil
))
1420 DEFUN ("assq", Fassq
, Sassq
, 2, 2, 0,
1421 doc
: /* Return non-nil if KEY is `eq' to the car of an element of LIST.
1422 The value is actually the first element of LIST whose car is KEY.
1423 Elements of LIST that are not conses are ignored. */)
1424 (Lisp_Object key
, Lisp_Object list
)
1429 || (CONSP (XCAR (list
))
1430 && EQ (XCAR (XCAR (list
)), key
)))
1435 || (CONSP (XCAR (list
))
1436 && EQ (XCAR (XCAR (list
)), key
)))
1441 || (CONSP (XCAR (list
))
1442 && EQ (XCAR (XCAR (list
)), key
)))
1452 /* Like Fassq but never report an error and do not allow quits.
1453 Use only on lists known never to be circular. */
1456 assq_no_quit (Lisp_Object key
, Lisp_Object list
)
1459 && (!CONSP (XCAR (list
))
1460 || !EQ (XCAR (XCAR (list
)), key
)))
1463 return CAR_SAFE (list
);
1466 DEFUN ("assoc", Fassoc
, Sassoc
, 2, 2, 0,
1467 doc
: /* Return non-nil if KEY is `equal' to the car of an element of LIST.
1468 The value is actually the first element of LIST whose car equals KEY. */)
1469 (Lisp_Object key
, Lisp_Object list
)
1476 || (CONSP (XCAR (list
))
1477 && (car
= XCAR (XCAR (list
)),
1478 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1483 || (CONSP (XCAR (list
))
1484 && (car
= XCAR (XCAR (list
)),
1485 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1490 || (CONSP (XCAR (list
))
1491 && (car
= XCAR (XCAR (list
)),
1492 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1502 /* Like Fassoc but never report an error and do not allow quits.
1503 Use only on lists known never to be circular. */
1506 assoc_no_quit (Lisp_Object key
, Lisp_Object list
)
1509 && (!CONSP (XCAR (list
))
1510 || (!EQ (XCAR (XCAR (list
)), key
)
1511 && NILP (Fequal (XCAR (XCAR (list
)), key
)))))
1514 return CONSP (list
) ? XCAR (list
) : Qnil
;
1517 DEFUN ("rassq", Frassq
, Srassq
, 2, 2, 0,
1518 doc
: /* Return non-nil if KEY is `eq' to the cdr of an element of LIST.
1519 The value is actually the first element of LIST whose cdr is KEY. */)
1520 (register Lisp_Object key
, Lisp_Object list
)
1525 || (CONSP (XCAR (list
))
1526 && EQ (XCDR (XCAR (list
)), key
)))
1531 || (CONSP (XCAR (list
))
1532 && EQ (XCDR (XCAR (list
)), key
)))
1537 || (CONSP (XCAR (list
))
1538 && EQ (XCDR (XCAR (list
)), key
)))
1548 DEFUN ("rassoc", Frassoc
, Srassoc
, 2, 2, 0,
1549 doc
: /* Return non-nil if KEY is `equal' to the cdr of an element of LIST.
1550 The value is actually the first element of LIST whose cdr equals KEY. */)
1551 (Lisp_Object key
, Lisp_Object list
)
1558 || (CONSP (XCAR (list
))
1559 && (cdr
= XCDR (XCAR (list
)),
1560 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1565 || (CONSP (XCAR (list
))
1566 && (cdr
= XCDR (XCAR (list
)),
1567 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1572 || (CONSP (XCAR (list
))
1573 && (cdr
= XCDR (XCAR (list
)),
1574 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1584 DEFUN ("delq", Fdelq
, Sdelq
, 2, 2, 0,
1585 doc
: /* Delete members of LIST which are `eq' to ELT, and return the result.
1586 More precisely, this function skips any members `eq' to ELT at the
1587 front of LIST, then removes members `eq' to ELT from the remaining
1588 sublist by modifying its list structure, then returns the resulting
1591 Write `(setq foo (delq element foo))' to be sure of correctly changing
1592 the value of a list `foo'. */)
1593 (register Lisp_Object elt
, Lisp_Object list
)
1595 Lisp_Object tail
, tortoise
, prev
= Qnil
;
1598 FOR_EACH_TAIL (tail
, list
, tortoise
, skip
)
1600 Lisp_Object tem
= XCAR (tail
);
1606 Fsetcdr (prev
, XCDR (tail
));
1614 DEFUN ("delete", Fdelete
, Sdelete
, 2, 2, 0,
1615 doc
: /* Delete members of SEQ which are `equal' to ELT, and return the result.
1616 SEQ must be a sequence (i.e. a list, a vector, or a string).
1617 The return value is a sequence of the same type.
1619 If SEQ is a list, this behaves like `delq', except that it compares
1620 with `equal' instead of `eq'. In particular, it may remove elements
1621 by altering the list structure.
1623 If SEQ is not a list, deletion is never performed destructively;
1624 instead this function creates and returns a new vector or string.
1626 Write `(setq foo (delete element foo))' to be sure of correctly
1627 changing the value of a sequence `foo'. */)
1628 (Lisp_Object elt
, Lisp_Object seq
)
1634 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1635 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1638 if (n
!= ASIZE (seq
))
1640 struct Lisp_Vector
*p
= allocate_vector (n
);
1642 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1643 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1644 p
->contents
[n
++] = AREF (seq
, i
);
1646 XSETVECTOR (seq
, p
);
1649 else if (STRINGP (seq
))
1651 ptrdiff_t i
, ibyte
, nchars
, nbytes
, cbytes
;
1654 for (i
= nchars
= nbytes
= ibyte
= 0;
1656 ++i
, ibyte
+= cbytes
)
1658 if (STRING_MULTIBYTE (seq
))
1660 c
= STRING_CHAR (SDATA (seq
) + ibyte
);
1661 cbytes
= CHAR_BYTES (c
);
1669 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1676 if (nchars
!= SCHARS (seq
))
1680 tem
= make_uninit_multibyte_string (nchars
, nbytes
);
1681 if (!STRING_MULTIBYTE (seq
))
1682 STRING_SET_UNIBYTE (tem
);
1684 for (i
= nchars
= nbytes
= ibyte
= 0;
1686 ++i
, ibyte
+= cbytes
)
1688 if (STRING_MULTIBYTE (seq
))
1690 c
= STRING_CHAR (SDATA (seq
) + ibyte
);
1691 cbytes
= CHAR_BYTES (c
);
1699 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1701 unsigned char *from
= SDATA (seq
) + ibyte
;
1702 unsigned char *to
= SDATA (tem
) + nbytes
;
1708 for (n
= cbytes
; n
--; )
1718 Lisp_Object tail
, prev
;
1720 for (tail
= seq
, prev
= Qnil
; CONSP (tail
); tail
= XCDR (tail
))
1722 CHECK_LIST_CONS (tail
, seq
);
1724 if (!NILP (Fequal (elt
, XCAR (tail
))))
1729 Fsetcdr (prev
, XCDR (tail
));
1740 DEFUN ("nreverse", Fnreverse
, Snreverse
, 1, 1, 0,
1741 doc
: /* Reverse order of items in a list, vector or string SEQ.
1742 If SEQ is a list, it should be nil-terminated.
1743 This function may destructively modify SEQ to produce the value. */)
1748 else if (STRINGP (seq
))
1749 return Freverse (seq
);
1750 else if (CONSP (seq
))
1752 Lisp_Object prev
, tail
, next
;
1754 for (prev
= Qnil
, tail
= seq
; !NILP (tail
); tail
= next
)
1757 CHECK_LIST_CONS (tail
, tail
);
1759 Fsetcdr (tail
, prev
);
1764 else if (VECTORP (seq
))
1766 ptrdiff_t i
, size
= ASIZE (seq
);
1768 for (i
= 0; i
< size
/ 2; i
++)
1770 Lisp_Object tem
= AREF (seq
, i
);
1771 ASET (seq
, i
, AREF (seq
, size
- i
- 1));
1772 ASET (seq
, size
- i
- 1, tem
);
1775 else if (BOOL_VECTOR_P (seq
))
1777 ptrdiff_t i
, size
= bool_vector_size (seq
);
1779 for (i
= 0; i
< size
/ 2; i
++)
1781 bool tem
= bool_vector_bitref (seq
, i
);
1782 bool_vector_set (seq
, i
, bool_vector_bitref (seq
, size
- i
- 1));
1783 bool_vector_set (seq
, size
- i
- 1, tem
);
1787 wrong_type_argument (Qarrayp
, seq
);
1791 DEFUN ("reverse", Freverse
, Sreverse
, 1, 1, 0,
1792 doc
: /* Return the reversed copy of list, vector, or string SEQ.
1793 See also the function `nreverse', which is used more often. */)
1800 else if (CONSP (seq
))
1802 for (new = Qnil
; CONSP (seq
); seq
= XCDR (seq
))
1805 new = Fcons (XCAR (seq
), new);
1807 CHECK_LIST_END (seq
, seq
);
1809 else if (VECTORP (seq
))
1811 ptrdiff_t i
, size
= ASIZE (seq
);
1813 new = make_uninit_vector (size
);
1814 for (i
= 0; i
< size
; i
++)
1815 ASET (new, i
, AREF (seq
, size
- i
- 1));
1817 else if (BOOL_VECTOR_P (seq
))
1820 EMACS_INT nbits
= bool_vector_size (seq
);
1822 new = make_uninit_bool_vector (nbits
);
1823 for (i
= 0; i
< nbits
; i
++)
1824 bool_vector_set (new, i
, bool_vector_bitref (seq
, nbits
- i
- 1));
1826 else if (STRINGP (seq
))
1828 ptrdiff_t size
= SCHARS (seq
), bytes
= SBYTES (seq
);
1834 new = make_uninit_string (size
);
1835 for (i
= 0; i
< size
; i
++)
1836 SSET (new, i
, SREF (seq
, size
- i
- 1));
1840 unsigned char *p
, *q
;
1842 new = make_uninit_multibyte_string (size
, bytes
);
1843 p
= SDATA (seq
), q
= SDATA (new) + bytes
;
1844 while (q
> SDATA (new))
1848 ch
= STRING_CHAR_AND_LENGTH (p
, len
);
1850 CHAR_STRING (ch
, q
);
1855 wrong_type_argument (Qsequencep
, seq
);
1859 /* Sort LIST using PREDICATE, preserving original order of elements
1860 considered as equal. */
1863 sort_list (Lisp_Object list
, Lisp_Object predicate
)
1865 Lisp_Object front
, back
;
1866 register Lisp_Object len
, tem
;
1867 struct gcpro gcpro1
, gcpro2
;
1871 len
= Flength (list
);
1872 length
= XINT (len
);
1876 XSETINT (len
, (length
/ 2) - 1);
1877 tem
= Fnthcdr (len
, list
);
1879 Fsetcdr (tem
, Qnil
);
1881 GCPRO2 (front
, back
);
1882 front
= Fsort (front
, predicate
);
1883 back
= Fsort (back
, predicate
);
1885 return merge (front
, back
, predicate
);
1888 /* Using PRED to compare, return whether A and B are in order.
1889 Compare stably when A appeared before B in the input. */
1891 inorder (Lisp_Object pred
, Lisp_Object a
, Lisp_Object b
)
1893 return NILP (call2 (pred
, b
, a
));
1896 /* Using PRED to compare, merge from ALEN-length A and BLEN-length B
1897 into DEST. Argument arrays must be nonempty and must not overlap,
1898 except that B might be the last part of DEST. */
1900 merge_vectors (Lisp_Object pred
,
1901 ptrdiff_t alen
, Lisp_Object
const a
[restrict
VLA_ELEMS (alen
)],
1902 ptrdiff_t blen
, Lisp_Object
const b
[VLA_ELEMS (blen
)],
1903 Lisp_Object dest
[VLA_ELEMS (alen
+ blen
)])
1905 eassume (0 < alen
&& 0 < blen
);
1906 Lisp_Object
const *alim
= a
+ alen
;
1907 Lisp_Object
const *blim
= b
+ blen
;
1911 if (inorder (pred
, a
[0], b
[0]))
1917 memcpy (dest
, b
, (blim
- b
) * sizeof *dest
);
1926 memcpy (dest
, a
, (alim
- a
) * sizeof *dest
);
1933 /* Using PRED to compare, sort LEN-length VEC in place, using TMP for
1934 temporary storage. LEN must be at least 2. */
1936 sort_vector_inplace (Lisp_Object pred
, ptrdiff_t len
,
1937 Lisp_Object vec
[restrict
VLA_ELEMS (len
)],
1938 Lisp_Object tmp
[restrict
VLA_ELEMS (len
>> 1)])
1941 ptrdiff_t halflen
= len
>> 1;
1942 sort_vector_copy (pred
, halflen
, vec
, tmp
);
1943 if (1 < len
- halflen
)
1944 sort_vector_inplace (pred
, len
- halflen
, vec
+ halflen
, vec
);
1945 merge_vectors (pred
, halflen
, tmp
, len
- halflen
, vec
+ halflen
, vec
);
1948 /* Using PRED to compare, sort from LEN-length SRC into DST.
1949 Len must be positive. */
1951 sort_vector_copy (Lisp_Object pred
, ptrdiff_t len
,
1952 Lisp_Object src
[restrict
VLA_ELEMS (len
)],
1953 Lisp_Object dest
[restrict
VLA_ELEMS (len
)])
1956 ptrdiff_t halflen
= len
>> 1;
1962 sort_vector_inplace (pred
, halflen
, src
, dest
);
1963 if (1 < len
- halflen
)
1964 sort_vector_inplace (pred
, len
- halflen
, src
+ halflen
, dest
);
1965 merge_vectors (pred
, halflen
, src
, len
- halflen
, src
+ halflen
, dest
);
1969 /* Sort VECTOR in place using PREDICATE, preserving original order of
1970 elements considered as equal. */
1973 sort_vector (Lisp_Object vector
, Lisp_Object predicate
)
1975 ptrdiff_t len
= ASIZE (vector
);
1978 ptrdiff_t halflen
= len
>> 1;
1980 struct gcpro gcpro1
, gcpro2
;
1981 GCPRO2 (vector
, predicate
);
1983 SAFE_ALLOCA_LISP (tmp
, halflen
);
1984 for (ptrdiff_t i
= 0; i
< halflen
; i
++)
1985 tmp
[i
] = make_number (0);
1986 sort_vector_inplace (predicate
, len
, XVECTOR (vector
)->contents
, tmp
);
1991 DEFUN ("sort", Fsort
, Ssort
, 2, 2, 0,
1992 doc
: /* Sort SEQ, stably, comparing elements using PREDICATE.
1993 Returns the sorted sequence. SEQ should be a list or vector. SEQ is
1994 modified by side effects. PREDICATE is called with two elements of
1995 SEQ, and should return non-nil if the first element should sort before
1997 (Lisp_Object seq
, Lisp_Object predicate
)
2000 seq
= sort_list (seq
, predicate
);
2001 else if (VECTORP (seq
))
2002 sort_vector (seq
, predicate
);
2003 else if (!NILP (seq
))
2004 wrong_type_argument (Qsequencep
, seq
);
2009 merge (Lisp_Object org_l1
, Lisp_Object org_l2
, Lisp_Object pred
)
2012 register Lisp_Object tail
;
2014 register Lisp_Object l1
, l2
;
2015 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
2022 /* It is sufficient to protect org_l1 and org_l2.
2023 When l1 and l2 are updated, we copy the new values
2024 back into the org_ vars. */
2025 GCPRO4 (org_l1
, org_l2
, pred
, value
);
2045 if (inorder (pred
, Fcar (l1
), Fcar (l2
)))
2060 Fsetcdr (tail
, tem
);
2066 /* This does not check for quits. That is safe since it must terminate. */
2068 DEFUN ("plist-get", Fplist_get
, Splist_get
, 2, 2, 0,
2069 doc
: /* Extract a value from a property list.
2070 PLIST is a property list, which is a list of the form
2071 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2072 corresponding to the given PROP, or nil if PROP is not one of the
2073 properties on the list. This function never signals an error. */)
2074 (Lisp_Object plist
, Lisp_Object prop
)
2076 Lisp_Object tail
, halftail
;
2078 /* halftail is used to detect circular lists. */
2079 tail
= halftail
= plist
;
2080 while (CONSP (tail
) && CONSP (XCDR (tail
)))
2082 if (EQ (prop
, XCAR (tail
)))
2083 return XCAR (XCDR (tail
));
2085 tail
= XCDR (XCDR (tail
));
2086 halftail
= XCDR (halftail
);
2087 if (EQ (tail
, halftail
))
2094 DEFUN ("get", Fget
, Sget
, 2, 2, 0,
2095 doc
: /* Return the value of SYMBOL's PROPNAME property.
2096 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'. */)
2097 (Lisp_Object symbol
, Lisp_Object propname
)
2099 CHECK_SYMBOL (symbol
);
2100 return Fplist_get (XSYMBOL (symbol
)->plist
, propname
);
2103 DEFUN ("plist-put", Fplist_put
, Splist_put
, 3, 3, 0,
2104 doc
: /* Change value in PLIST of PROP to VAL.
2105 PLIST is a property list, which is a list of the form
2106 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.
2107 If PROP is already a property on the list, its value is set to VAL,
2108 otherwise the new PROP VAL pair is added. The new plist is returned;
2109 use `(setq x (plist-put x prop val))' to be sure to use the new value.
2110 The PLIST is modified by side effects. */)
2111 (Lisp_Object plist
, register Lisp_Object prop
, Lisp_Object val
)
2113 register Lisp_Object tail
, prev
;
2114 Lisp_Object newcell
;
2116 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
2117 tail
= XCDR (XCDR (tail
)))
2119 if (EQ (prop
, XCAR (tail
)))
2121 Fsetcar (XCDR (tail
), val
);
2128 newcell
= Fcons (prop
, Fcons (val
, NILP (prev
) ? plist
: XCDR (XCDR (prev
))));
2132 Fsetcdr (XCDR (prev
), newcell
);
2136 DEFUN ("put", Fput
, Sput
, 3, 3, 0,
2137 doc
: /* Store SYMBOL's PROPNAME property with value VALUE.
2138 It can be retrieved with `(get SYMBOL PROPNAME)'. */)
2139 (Lisp_Object symbol
, Lisp_Object propname
, Lisp_Object value
)
2141 CHECK_SYMBOL (symbol
);
2143 (symbol
, Fplist_put (XSYMBOL (symbol
)->plist
, propname
, value
));
2147 DEFUN ("lax-plist-get", Flax_plist_get
, Slax_plist_get
, 2, 2, 0,
2148 doc
: /* Extract a value from a property list, comparing with `equal'.
2149 PLIST is a property list, which is a list of the form
2150 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2151 corresponding to the given PROP, or nil if PROP is not
2152 one of the properties on the list. */)
2153 (Lisp_Object plist
, Lisp_Object prop
)
2158 CONSP (tail
) && CONSP (XCDR (tail
));
2159 tail
= XCDR (XCDR (tail
)))
2161 if (! NILP (Fequal (prop
, XCAR (tail
))))
2162 return XCAR (XCDR (tail
));
2167 CHECK_LIST_END (tail
, prop
);
2172 DEFUN ("lax-plist-put", Flax_plist_put
, Slax_plist_put
, 3, 3, 0,
2173 doc
: /* Change value in PLIST of PROP to VAL, comparing with `equal'.
2174 PLIST is a property list, which is a list of the form
2175 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP and VAL are any objects.
2176 If PROP is already a property on the list, its value is set to VAL,
2177 otherwise the new PROP VAL pair is added. The new plist is returned;
2178 use `(setq x (lax-plist-put x prop val))' to be sure to use the new value.
2179 The PLIST is modified by side effects. */)
2180 (Lisp_Object plist
, register Lisp_Object prop
, Lisp_Object val
)
2182 register Lisp_Object tail
, prev
;
2183 Lisp_Object newcell
;
2185 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
2186 tail
= XCDR (XCDR (tail
)))
2188 if (! NILP (Fequal (prop
, XCAR (tail
))))
2190 Fsetcar (XCDR (tail
), val
);
2197 newcell
= list2 (prop
, val
);
2201 Fsetcdr (XCDR (prev
), newcell
);
2205 DEFUN ("eql", Feql
, Seql
, 2, 2, 0,
2206 doc
: /* Return t if the two args are the same Lisp object.
2207 Floating-point numbers of equal value are `eql', but they may not be `eq'. */)
2208 (Lisp_Object obj1
, Lisp_Object obj2
)
2211 return internal_equal (obj1
, obj2
, 0, 0, Qnil
) ? Qt
: Qnil
;
2213 return EQ (obj1
, obj2
) ? Qt
: Qnil
;
2216 DEFUN ("equal", Fequal
, Sequal
, 2, 2, 0,
2217 doc
: /* Return t if two Lisp objects have similar structure and contents.
2218 They must have the same data type.
2219 Conses are compared by comparing the cars and the cdrs.
2220 Vectors and strings are compared element by element.
2221 Numbers are compared by value, but integers cannot equal floats.
2222 (Use `=' if you want integers and floats to be able to be equal.)
2223 Symbols must match exactly. */)
2224 (register Lisp_Object o1
, Lisp_Object o2
)
2226 return internal_equal (o1
, o2
, 0, 0, Qnil
) ? Qt
: Qnil
;
2229 DEFUN ("equal-including-properties", Fequal_including_properties
, Sequal_including_properties
, 2, 2, 0,
2230 doc
: /* Return t if two Lisp objects have similar structure and contents.
2231 This is like `equal' except that it compares the text properties
2232 of strings. (`equal' ignores text properties.) */)
2233 (register Lisp_Object o1
, Lisp_Object o2
)
2235 return internal_equal (o1
, o2
, 0, 1, Qnil
) ? Qt
: Qnil
;
2238 /* DEPTH is current depth of recursion. Signal an error if it
2240 PROPS means compare string text properties too. */
2243 internal_equal (Lisp_Object o1
, Lisp_Object o2
, int depth
, bool props
,
2249 error ("Stack overflow in equal");
2251 ht
= CALLN (Fmake_hash_table
, QCtest
, Qeq
);
2254 case Lisp_Cons
: case Lisp_Misc
: case Lisp_Vectorlike
:
2256 struct Lisp_Hash_Table
*h
= XHASH_TABLE (ht
);
2258 ptrdiff_t i
= hash_lookup (h
, o1
, &hash
);
2260 { /* `o1' was seen already. */
2261 Lisp_Object o2s
= HASH_VALUE (h
, i
);
2262 if (!NILP (Fmemq (o2
, o2s
)))
2265 set_hash_value_slot (h
, i
, Fcons (o2
, o2s
));
2268 hash_put (h
, o1
, Fcons (o2
, Qnil
), hash
);
2278 if (XTYPE (o1
) != XTYPE (o2
))
2287 d1
= extract_float (o1
);
2288 d2
= extract_float (o2
);
2289 /* If d is a NaN, then d != d. Two NaNs should be `equal' even
2290 though they are not =. */
2291 return d1
== d2
|| (d1
!= d1
&& d2
!= d2
);
2295 if (!internal_equal (XCAR (o1
), XCAR (o2
), depth
+ 1, props
, ht
))
2299 /* FIXME: This inf-loops in a circular list! */
2303 if (XMISCTYPE (o1
) != XMISCTYPE (o2
))
2307 if (!internal_equal (OVERLAY_START (o1
), OVERLAY_START (o2
),
2308 depth
+ 1, props
, ht
)
2309 || !internal_equal (OVERLAY_END (o1
), OVERLAY_END (o2
),
2310 depth
+ 1, props
, ht
))
2312 o1
= XOVERLAY (o1
)->plist
;
2313 o2
= XOVERLAY (o2
)->plist
;
2318 return (XMARKER (o1
)->buffer
== XMARKER (o2
)->buffer
2319 && (XMARKER (o1
)->buffer
== 0
2320 || XMARKER (o1
)->bytepos
== XMARKER (o2
)->bytepos
));
2324 case Lisp_Vectorlike
:
2327 ptrdiff_t size
= ASIZE (o1
);
2328 /* Pseudovectors have the type encoded in the size field, so this test
2329 actually checks that the objects have the same type as well as the
2331 if (ASIZE (o2
) != size
)
2333 /* Boolvectors are compared much like strings. */
2334 if (BOOL_VECTOR_P (o1
))
2336 EMACS_INT size
= bool_vector_size (o1
);
2337 if (size
!= bool_vector_size (o2
))
2339 if (memcmp (bool_vector_data (o1
), bool_vector_data (o2
),
2340 bool_vector_bytes (size
)))
2344 if (WINDOW_CONFIGURATIONP (o1
))
2345 return compare_window_configurations (o1
, o2
, 0);
2347 /* Aside from them, only true vectors, char-tables, compiled
2348 functions, and fonts (font-spec, font-entity, font-object)
2349 are sensible to compare, so eliminate the others now. */
2350 if (size
& PSEUDOVECTOR_FLAG
)
2352 if (((size
& PVEC_TYPE_MASK
) >> PSEUDOVECTOR_AREA_BITS
)
2355 size
&= PSEUDOVECTOR_SIZE_MASK
;
2357 for (i
= 0; i
< size
; i
++)
2362 if (!internal_equal (v1
, v2
, depth
+ 1, props
, ht
))
2370 if (SCHARS (o1
) != SCHARS (o2
))
2372 if (SBYTES (o1
) != SBYTES (o2
))
2374 if (memcmp (SDATA (o1
), SDATA (o2
), SBYTES (o1
)))
2376 if (props
&& !compare_string_intervals (o1
, o2
))
2388 DEFUN ("fillarray", Ffillarray
, Sfillarray
, 2, 2, 0,
2389 doc
: /* Store each element of ARRAY with ITEM.
2390 ARRAY is a vector, string, char-table, or bool-vector. */)
2391 (Lisp_Object array
, Lisp_Object item
)
2393 register ptrdiff_t size
, idx
;
2395 if (VECTORP (array
))
2396 for (idx
= 0, size
= ASIZE (array
); idx
< size
; idx
++)
2397 ASET (array
, idx
, item
);
2398 else if (CHAR_TABLE_P (array
))
2402 for (i
= 0; i
< (1 << CHARTAB_SIZE_BITS_0
); i
++)
2403 set_char_table_contents (array
, i
, item
);
2404 set_char_table_defalt (array
, item
);
2406 else if (STRINGP (array
))
2408 register unsigned char *p
= SDATA (array
);
2410 CHECK_CHARACTER (item
);
2411 charval
= XFASTINT (item
);
2412 size
= SCHARS (array
);
2413 if (STRING_MULTIBYTE (array
))
2415 unsigned char str
[MAX_MULTIBYTE_LENGTH
];
2416 int len
= CHAR_STRING (charval
, str
);
2417 ptrdiff_t size_byte
= SBYTES (array
);
2419 if (INT_MULTIPLY_OVERFLOW (SCHARS (array
), len
)
2420 || SCHARS (array
) * len
!= size_byte
)
2421 error ("Attempt to change byte length of a string");
2422 for (idx
= 0; idx
< size_byte
; idx
++)
2423 *p
++ = str
[idx
% len
];
2426 for (idx
= 0; idx
< size
; idx
++)
2429 else if (BOOL_VECTOR_P (array
))
2430 return bool_vector_fill (array
, item
);
2432 wrong_type_argument (Qarrayp
, array
);
2436 DEFUN ("clear-string", Fclear_string
, Sclear_string
,
2438 doc
: /* Clear the contents of STRING.
2439 This makes STRING unibyte and may change its length. */)
2440 (Lisp_Object string
)
2443 CHECK_STRING (string
);
2444 len
= SBYTES (string
);
2445 memset (SDATA (string
), 0, len
);
2446 STRING_SET_CHARS (string
, len
);
2447 STRING_SET_UNIBYTE (string
);
2453 nconc2 (Lisp_Object s1
, Lisp_Object s2
)
2455 return CALLN (Fnconc
, s1
, s2
);
2458 DEFUN ("nconc", Fnconc
, Snconc
, 0, MANY
, 0,
2459 doc
: /* Concatenate any number of lists by altering them.
2460 Only the last argument is not altered, and need not be a list.
2461 usage: (nconc &rest LISTS) */)
2462 (ptrdiff_t nargs
, Lisp_Object
*args
)
2465 register Lisp_Object tail
, tem
, val
;
2469 for (argnum
= 0; argnum
< nargs
; argnum
++)
2472 if (NILP (tem
)) continue;
2477 if (argnum
+ 1 == nargs
) break;
2479 CHECK_LIST_CONS (tem
, tem
);
2488 tem
= args
[argnum
+ 1];
2489 Fsetcdr (tail
, tem
);
2491 args
[argnum
+ 1] = tail
;
2497 /* This is the guts of all mapping functions.
2498 Apply FN to each element of SEQ, one by one,
2499 storing the results into elements of VALS, a C vector of Lisp_Objects.
2500 LENI is the length of VALS, which should also be the length of SEQ. */
2503 mapcar1 (EMACS_INT leni
, Lisp_Object
*vals
, Lisp_Object fn
, Lisp_Object seq
)
2505 Lisp_Object tail
, dummy
;
2507 struct gcpro gcpro1
, gcpro2
, gcpro3
;
2511 /* Don't let vals contain any garbage when GC happens. */
2512 memclear (vals
, leni
* word_size
);
2514 GCPRO3 (dummy
, fn
, seq
);
2516 gcpro1
.nvars
= leni
;
2520 /* We need not explicitly protect `tail' because it is used only on lists, and
2521 1) lists are not relocated and 2) the list is marked via `seq' so will not
2524 if (VECTORP (seq
) || COMPILEDP (seq
))
2526 for (i
= 0; i
< leni
; i
++)
2528 dummy
= call1 (fn
, AREF (seq
, i
));
2533 else if (BOOL_VECTOR_P (seq
))
2535 for (i
= 0; i
< leni
; i
++)
2537 dummy
= call1 (fn
, bool_vector_ref (seq
, i
));
2542 else if (STRINGP (seq
))
2546 for (i
= 0, i_byte
= 0; i
< leni
;)
2549 ptrdiff_t i_before
= i
;
2551 FETCH_STRING_CHAR_ADVANCE (c
, seq
, i
, i_byte
);
2552 XSETFASTINT (dummy
, c
);
2553 dummy
= call1 (fn
, dummy
);
2555 vals
[i_before
] = dummy
;
2558 else /* Must be a list, since Flength did not get an error */
2561 for (i
= 0; i
< leni
&& CONSP (tail
); i
++)
2563 dummy
= call1 (fn
, XCAR (tail
));
2573 DEFUN ("mapconcat", Fmapconcat
, Smapconcat
, 3, 3, 0,
2574 doc
: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
2575 In between each pair of results, stick in SEPARATOR. Thus, " " as
2576 SEPARATOR results in spaces between the values returned by FUNCTION.
2577 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2578 (Lisp_Object function
, Lisp_Object sequence
, Lisp_Object separator
)
2581 register EMACS_INT leni
;
2584 register Lisp_Object
*args
;
2585 struct gcpro gcpro1
;
2589 len
= Flength (sequence
);
2590 if (CHAR_TABLE_P (sequence
))
2591 wrong_type_argument (Qlistp
, sequence
);
2593 nargs
= leni
+ leni
- 1;
2594 if (nargs
< 0) return empty_unibyte_string
;
2596 SAFE_ALLOCA_LISP (args
, nargs
);
2599 mapcar1 (leni
, args
, function
, sequence
);
2602 for (i
= leni
- 1; i
> 0; i
--)
2603 args
[i
+ i
] = args
[i
];
2605 for (i
= 1; i
< nargs
; i
+= 2)
2606 args
[i
] = separator
;
2608 ret
= Fconcat (nargs
, args
);
2614 DEFUN ("mapcar", Fmapcar
, Smapcar
, 2, 2, 0,
2615 doc
: /* Apply FUNCTION to each element of SEQUENCE, and make a list of the results.
2616 The result is a list just as long as SEQUENCE.
2617 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2618 (Lisp_Object function
, Lisp_Object sequence
)
2620 register Lisp_Object len
;
2621 register EMACS_INT leni
;
2622 register Lisp_Object
*args
;
2626 len
= Flength (sequence
);
2627 if (CHAR_TABLE_P (sequence
))
2628 wrong_type_argument (Qlistp
, sequence
);
2629 leni
= XFASTINT (len
);
2631 SAFE_ALLOCA_LISP (args
, leni
);
2633 mapcar1 (leni
, args
, function
, sequence
);
2635 ret
= Flist (leni
, args
);
2641 DEFUN ("mapc", Fmapc
, Smapc
, 2, 2, 0,
2642 doc
: /* Apply FUNCTION to each element of SEQUENCE for side effects only.
2643 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.
2644 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2645 (Lisp_Object function
, Lisp_Object sequence
)
2647 register EMACS_INT leni
;
2649 leni
= XFASTINT (Flength (sequence
));
2650 if (CHAR_TABLE_P (sequence
))
2651 wrong_type_argument (Qlistp
, sequence
);
2652 mapcar1 (leni
, 0, function
, sequence
);
2657 /* This is how C code calls `yes-or-no-p' and allows the user
2660 Anything that calls this function must protect from GC! */
2663 do_yes_or_no_p (Lisp_Object prompt
)
2665 return call1 (intern ("yes-or-no-p"), prompt
);
2668 /* Anything that calls this function must protect from GC! */
2670 DEFUN ("yes-or-no-p", Fyes_or_no_p
, Syes_or_no_p
, 1, 1, 0,
2671 doc
: /* Ask user a yes-or-no question.
2672 Return t if answer is yes, and nil if the answer is no.
2673 PROMPT is the string to display to ask the question. It should end in
2674 a space; `yes-or-no-p' adds \"(yes or no) \" to it.
2676 The user must confirm the answer with RET, and can edit it until it
2679 If dialog boxes are supported, a dialog box will be used
2680 if `last-nonmenu-event' is nil, and `use-dialog-box' is non-nil. */)
2681 (Lisp_Object prompt
)
2684 struct gcpro gcpro1
;
2686 CHECK_STRING (prompt
);
2688 if ((NILP (last_nonmenu_event
) || CONSP (last_nonmenu_event
))
2691 Lisp_Object pane
, menu
, obj
;
2692 redisplay_preserve_echo_area (4);
2693 pane
= list2 (Fcons (build_string ("Yes"), Qt
),
2694 Fcons (build_string ("No"), Qnil
));
2696 menu
= Fcons (prompt
, pane
);
2697 obj
= Fx_popup_dialog (Qt
, menu
, Qnil
);
2702 AUTO_STRING (yes_or_no
, "(yes or no) ");
2703 prompt
= CALLN (Fconcat
, prompt
, yes_or_no
);
2708 ans
= Fdowncase (Fread_from_minibuffer (prompt
, Qnil
, Qnil
, Qnil
,
2709 Qyes_or_no_p_history
, Qnil
,
2711 if (SCHARS (ans
) == 3 && !strcmp (SSDATA (ans
), "yes"))
2716 if (SCHARS (ans
) == 2 && !strcmp (SSDATA (ans
), "no"))
2724 message1 ("Please answer yes or no.");
2725 Fsleep_for (make_number (2), Qnil
);
2729 DEFUN ("load-average", Fload_average
, Sload_average
, 0, 1, 0,
2730 doc
: /* Return list of 1 minute, 5 minute and 15 minute load averages.
2732 Each of the three load averages is multiplied by 100, then converted
2735 When USE-FLOATS is non-nil, floats will be used instead of integers.
2736 These floats are not multiplied by 100.
2738 If the 5-minute or 15-minute load averages are not available, return a
2739 shortened list, containing only those averages which are available.
2741 An error is thrown if the load average can't be obtained. In some
2742 cases making it work would require Emacs being installed setuid or
2743 setgid so that it can read kernel information, and that usually isn't
2745 (Lisp_Object use_floats
)
2748 int loads
= getloadavg (load_ave
, 3);
2749 Lisp_Object ret
= Qnil
;
2752 error ("load-average not implemented for this operating system");
2756 Lisp_Object load
= (NILP (use_floats
)
2757 ? make_number (100.0 * load_ave
[loads
])
2758 : make_float (load_ave
[loads
]));
2759 ret
= Fcons (load
, ret
);
2765 DEFUN ("featurep", Ffeaturep
, Sfeaturep
, 1, 2, 0,
2766 doc
: /* Return t if FEATURE is present in this Emacs.
2768 Use this to conditionalize execution of lisp code based on the
2769 presence or absence of Emacs or environment extensions.
2770 Use `provide' to declare that a feature is available. This function
2771 looks at the value of the variable `features'. The optional argument
2772 SUBFEATURE can be used to check a specific subfeature of FEATURE. */)
2773 (Lisp_Object feature
, Lisp_Object subfeature
)
2775 register Lisp_Object tem
;
2776 CHECK_SYMBOL (feature
);
2777 tem
= Fmemq (feature
, Vfeatures
);
2778 if (!NILP (tem
) && !NILP (subfeature
))
2779 tem
= Fmember (subfeature
, Fget (feature
, Qsubfeatures
));
2780 return (NILP (tem
)) ? Qnil
: Qt
;
2783 DEFUN ("provide", Fprovide
, Sprovide
, 1, 2, 0,
2784 doc
: /* Announce that FEATURE is a feature of the current Emacs.
2785 The optional argument SUBFEATURES should be a list of symbols listing
2786 particular subfeatures supported in this version of FEATURE. */)
2787 (Lisp_Object feature
, Lisp_Object subfeatures
)
2789 register Lisp_Object tem
;
2790 CHECK_SYMBOL (feature
);
2791 CHECK_LIST (subfeatures
);
2792 if (!NILP (Vautoload_queue
))
2793 Vautoload_queue
= Fcons (Fcons (make_number (0), Vfeatures
),
2795 tem
= Fmemq (feature
, Vfeatures
);
2797 Vfeatures
= Fcons (feature
, Vfeatures
);
2798 if (!NILP (subfeatures
))
2799 Fput (feature
, Qsubfeatures
, subfeatures
);
2800 LOADHIST_ATTACH (Fcons (Qprovide
, feature
));
2802 /* Run any load-hooks for this file. */
2803 tem
= Fassq (feature
, Vafter_load_alist
);
2805 Fmapc (Qfuncall
, XCDR (tem
));
2810 /* `require' and its subroutines. */
2812 /* List of features currently being require'd, innermost first. */
2814 static Lisp_Object require_nesting_list
;
2817 require_unwind (Lisp_Object old_value
)
2819 require_nesting_list
= old_value
;
2822 DEFUN ("require", Frequire
, Srequire
, 1, 3, 0,
2823 doc
: /* If feature FEATURE is not loaded, load it from FILENAME.
2824 If FEATURE is not a member of the list `features', then the feature
2825 is not loaded; so load the file FILENAME.
2826 If FILENAME is omitted, the printname of FEATURE is used as the file name,
2827 and `load' will try to load this name appended with the suffix `.elc' or
2828 `.el', in that order. The name without appended suffix will not be used.
2829 See `get-load-suffixes' for the complete list of suffixes.
2830 If the optional third argument NOERROR is non-nil,
2831 then return nil if the file is not found instead of signaling an error.
2832 Normally the return value is FEATURE.
2833 The normal messages at start and end of loading FILENAME are suppressed. */)
2834 (Lisp_Object feature
, Lisp_Object filename
, Lisp_Object noerror
)
2837 struct gcpro gcpro1
, gcpro2
;
2838 bool from_file
= load_in_progress
;
2840 CHECK_SYMBOL (feature
);
2842 /* Record the presence of `require' in this file
2843 even if the feature specified is already loaded.
2844 But not more than once in any file,
2845 and not when we aren't loading or reading from a file. */
2847 for (tem
= Vcurrent_load_list
; CONSP (tem
); tem
= XCDR (tem
))
2848 if (NILP (XCDR (tem
)) && STRINGP (XCAR (tem
)))
2853 tem
= Fcons (Qrequire
, feature
);
2854 if (NILP (Fmember (tem
, Vcurrent_load_list
)))
2855 LOADHIST_ATTACH (tem
);
2857 tem
= Fmemq (feature
, Vfeatures
);
2861 ptrdiff_t count
= SPECPDL_INDEX ();
2864 /* This is to make sure that loadup.el gives a clear picture
2865 of what files are preloaded and when. */
2866 if (! NILP (Vpurify_flag
))
2867 error ("(require %s) while preparing to dump",
2868 SDATA (SYMBOL_NAME (feature
)));
2870 /* A certain amount of recursive `require' is legitimate,
2871 but if we require the same feature recursively 3 times,
2873 tem
= require_nesting_list
;
2874 while (! NILP (tem
))
2876 if (! NILP (Fequal (feature
, XCAR (tem
))))
2881 error ("Recursive `require' for feature `%s'",
2882 SDATA (SYMBOL_NAME (feature
)));
2884 /* Update the list for any nested `require's that occur. */
2885 record_unwind_protect (require_unwind
, require_nesting_list
);
2886 require_nesting_list
= Fcons (feature
, require_nesting_list
);
2888 /* Value saved here is to be restored into Vautoload_queue */
2889 record_unwind_protect (un_autoload
, Vautoload_queue
);
2890 Vautoload_queue
= Qt
;
2892 /* Load the file. */
2893 GCPRO2 (feature
, filename
);
2894 tem
= Fload (NILP (filename
) ? Fsymbol_name (feature
) : filename
,
2895 noerror
, Qt
, Qnil
, (NILP (filename
) ? Qt
: Qnil
));
2898 /* If load failed entirely, return nil. */
2900 return unbind_to (count
, Qnil
);
2902 tem
= Fmemq (feature
, Vfeatures
);
2904 error ("Required feature `%s' was not provided",
2905 SDATA (SYMBOL_NAME (feature
)));
2907 /* Once loading finishes, don't undo it. */
2908 Vautoload_queue
= Qt
;
2909 feature
= unbind_to (count
, feature
);
2915 /* Primitives for work of the "widget" library.
2916 In an ideal world, this section would not have been necessary.
2917 However, lisp function calls being as slow as they are, it turns
2918 out that some functions in the widget library (wid-edit.el) are the
2919 bottleneck of Widget operation. Here is their translation to C,
2920 for the sole reason of efficiency. */
2922 DEFUN ("plist-member", Fplist_member
, Splist_member
, 2, 2, 0,
2923 doc
: /* Return non-nil if PLIST has the property PROP.
2924 PLIST is a property list, which is a list of the form
2925 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.
2926 Unlike `plist-get', this allows you to distinguish between a missing
2927 property and a property with the value nil.
2928 The value is actually the tail of PLIST whose car is PROP. */)
2929 (Lisp_Object plist
, Lisp_Object prop
)
2931 while (CONSP (plist
) && !EQ (XCAR (plist
), prop
))
2934 plist
= XCDR (plist
);
2935 plist
= CDR (plist
);
2940 DEFUN ("widget-put", Fwidget_put
, Swidget_put
, 3, 3, 0,
2941 doc
: /* In WIDGET, set PROPERTY to VALUE.
2942 The value can later be retrieved with `widget-get'. */)
2943 (Lisp_Object widget
, Lisp_Object property
, Lisp_Object value
)
2945 CHECK_CONS (widget
);
2946 XSETCDR (widget
, Fplist_put (XCDR (widget
), property
, value
));
2950 DEFUN ("widget-get", Fwidget_get
, Swidget_get
, 2, 2, 0,
2951 doc
: /* In WIDGET, get the value of PROPERTY.
2952 The value could either be specified when the widget was created, or
2953 later with `widget-put'. */)
2954 (Lisp_Object widget
, Lisp_Object property
)
2962 CHECK_CONS (widget
);
2963 tmp
= Fplist_member (XCDR (widget
), property
);
2969 tmp
= XCAR (widget
);
2972 widget
= Fget (tmp
, Qwidget_type
);
2976 DEFUN ("widget-apply", Fwidget_apply
, Swidget_apply
, 2, MANY
, 0,
2977 doc
: /* Apply the value of WIDGET's PROPERTY to the widget itself.
2978 ARGS are passed as extra arguments to the function.
2979 usage: (widget-apply WIDGET PROPERTY &rest ARGS) */)
2980 (ptrdiff_t nargs
, Lisp_Object
*args
)
2982 /* This function can GC. */
2983 struct gcpro gcpro1
, gcpro2
;
2984 Lisp_Object widget
= args
[0];
2985 Lisp_Object property
= args
[1];
2986 Lisp_Object propval
= Fwidget_get (widget
, property
);
2987 Lisp_Object trailing_args
= Flist (nargs
- 2, args
+ 2);
2988 GCPRO2 (propval
, trailing_args
);
2989 Lisp_Object result
= CALLN (Fapply
, propval
, widget
, trailing_args
);
2994 #ifdef HAVE_LANGINFO_CODESET
2995 #include <langinfo.h>
2998 DEFUN ("locale-info", Flocale_info
, Slocale_info
, 1, 1, 0,
2999 doc
: /* Access locale data ITEM for the current C locale, if available.
3000 ITEM should be one of the following:
3002 `codeset', returning the character set as a string (locale item CODESET);
3004 `days', returning a 7-element vector of day names (locale items DAY_n);
3006 `months', returning a 12-element vector of month names (locale items MON_n);
3008 `paper', returning a list (WIDTH HEIGHT) for the default paper size,
3009 both measured in millimeters (locale items PAPER_WIDTH, PAPER_HEIGHT).
3011 If the system can't provide such information through a call to
3012 `nl_langinfo', or if ITEM isn't from the list above, return nil.
3014 See also Info node `(libc)Locales'.
3016 The data read from the system are decoded using `locale-coding-system'. */)
3020 #ifdef HAVE_LANGINFO_CODESET
3022 if (EQ (item
, Qcodeset
))
3024 str
= nl_langinfo (CODESET
);
3025 return build_string (str
);
3028 else if (EQ (item
, Qdays
)) /* e.g. for calendar-day-name-array */
3030 Lisp_Object v
= Fmake_vector (make_number (7), Qnil
);
3031 const int days
[7] = {DAY_1
, DAY_2
, DAY_3
, DAY_4
, DAY_5
, DAY_6
, DAY_7
};
3033 struct gcpro gcpro1
;
3035 synchronize_system_time_locale ();
3036 for (i
= 0; i
< 7; i
++)
3038 str
= nl_langinfo (days
[i
]);
3039 val
= build_unibyte_string (str
);
3040 /* Fixme: Is this coding system necessarily right, even if
3041 it is consistent with CODESET? If not, what to do? */
3042 ASET (v
, i
, code_convert_string_norecord (val
, Vlocale_coding_system
,
3050 else if (EQ (item
, Qmonths
)) /* e.g. for calendar-month-name-array */
3052 Lisp_Object v
= Fmake_vector (make_number (12), Qnil
);
3053 const int months
[12] = {MON_1
, MON_2
, MON_3
, MON_4
, MON_5
, MON_6
, MON_7
,
3054 MON_8
, MON_9
, MON_10
, MON_11
, MON_12
};
3056 struct gcpro gcpro1
;
3058 synchronize_system_time_locale ();
3059 for (i
= 0; i
< 12; i
++)
3061 str
= nl_langinfo (months
[i
]);
3062 val
= build_unibyte_string (str
);
3063 ASET (v
, i
, code_convert_string_norecord (val
, Vlocale_coding_system
,
3070 /* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
3071 but is in the locale files. This could be used by ps-print. */
3073 else if (EQ (item
, Qpaper
))
3074 return list2i (nl_langinfo (PAPER_WIDTH
), nl_langinfo (PAPER_HEIGHT
));
3075 #endif /* PAPER_WIDTH */
3076 #endif /* HAVE_LANGINFO_CODESET*/
3080 /* base64 encode/decode functions (RFC 2045).
3081 Based on code from GNU recode. */
3083 #define MIME_LINE_LENGTH 76
3085 #define IS_ASCII(Character) \
3087 #define IS_BASE64(Character) \
3088 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
3089 #define IS_BASE64_IGNORABLE(Character) \
3090 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
3091 || (Character) == '\f' || (Character) == '\r')
3093 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
3094 character or return retval if there are no characters left to
3096 #define READ_QUADRUPLET_BYTE(retval) \
3101 if (nchars_return) \
3102 *nchars_return = nchars; \
3107 while (IS_BASE64_IGNORABLE (c))
3109 /* Table of characters coding the 64 values. */
3110 static const char base64_value_to_char
[64] =
3112 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
3113 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
3114 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
3115 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
3116 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
3117 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
3118 '8', '9', '+', '/' /* 60-63 */
3121 /* Table of base64 values for first 128 characters. */
3122 static const short base64_char_to_value
[128] =
3124 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
3125 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
3126 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
3127 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
3128 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
3129 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
3130 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
3131 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
3132 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
3133 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
3134 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
3135 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
3136 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
3139 /* The following diagram shows the logical steps by which three octets
3140 get transformed into four base64 characters.
3142 .--------. .--------. .--------.
3143 |aaaaaabb| |bbbbcccc| |ccdddddd|
3144 `--------' `--------' `--------'
3146 .--------+--------+--------+--------.
3147 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
3148 `--------+--------+--------+--------'
3150 .--------+--------+--------+--------.
3151 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
3152 `--------+--------+--------+--------'
3154 The octets are divided into 6 bit chunks, which are then encoded into
3155 base64 characters. */
3158 static ptrdiff_t base64_encode_1 (const char *, char *, ptrdiff_t, bool, bool);
3159 static ptrdiff_t base64_decode_1 (const char *, char *, ptrdiff_t, bool,
3162 DEFUN ("base64-encode-region", Fbase64_encode_region
, Sbase64_encode_region
,
3164 doc
: /* Base64-encode the region between BEG and END.
3165 Return the length of the encoded text.
3166 Optional third argument NO-LINE-BREAK means do not break long lines
3167 into shorter lines. */)
3168 (Lisp_Object beg
, Lisp_Object end
, Lisp_Object no_line_break
)
3171 ptrdiff_t allength
, length
;
3172 ptrdiff_t ibeg
, iend
, encoded_length
;
3173 ptrdiff_t old_pos
= PT
;
3176 validate_region (&beg
, &end
);
3178 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
3179 iend
= CHAR_TO_BYTE (XFASTINT (end
));
3180 move_gap_both (XFASTINT (beg
), ibeg
);
3182 /* We need to allocate enough room for encoding the text.
3183 We need 33 1/3% more space, plus a newline every 76
3184 characters, and then we round up. */
3185 length
= iend
- ibeg
;
3186 allength
= length
+ length
/3 + 1;
3187 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3189 encoded
= SAFE_ALLOCA (allength
);
3190 encoded_length
= base64_encode_1 ((char *) BYTE_POS_ADDR (ibeg
),
3191 encoded
, length
, NILP (no_line_break
),
3192 !NILP (BVAR (current_buffer
, enable_multibyte_characters
)));
3193 if (encoded_length
> allength
)
3196 if (encoded_length
< 0)
3198 /* The encoding wasn't possible. */
3200 error ("Multibyte character in data for base64 encoding");
3203 /* Now we have encoded the region, so we insert the new contents
3204 and delete the old. (Insert first in order to preserve markers.) */
3205 SET_PT_BOTH (XFASTINT (beg
), ibeg
);
3206 insert (encoded
, encoded_length
);
3208 del_range_byte (ibeg
+ encoded_length
, iend
+ encoded_length
, 1);
3210 /* If point was outside of the region, restore it exactly; else just
3211 move to the beginning of the region. */
3212 if (old_pos
>= XFASTINT (end
))
3213 old_pos
+= encoded_length
- (XFASTINT (end
) - XFASTINT (beg
));
3214 else if (old_pos
> XFASTINT (beg
))
3215 old_pos
= XFASTINT (beg
);
3218 /* We return the length of the encoded text. */
3219 return make_number (encoded_length
);
3222 DEFUN ("base64-encode-string", Fbase64_encode_string
, Sbase64_encode_string
,
3224 doc
: /* Base64-encode STRING and return the result.
3225 Optional second argument NO-LINE-BREAK means do not break long lines
3226 into shorter lines. */)
3227 (Lisp_Object string
, Lisp_Object no_line_break
)
3229 ptrdiff_t allength
, length
, encoded_length
;
3231 Lisp_Object encoded_string
;
3234 CHECK_STRING (string
);
3236 /* We need to allocate enough room for encoding the text.
3237 We need 33 1/3% more space, plus a newline every 76
3238 characters, and then we round up. */
3239 length
= SBYTES (string
);
3240 allength
= length
+ length
/3 + 1;
3241 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3243 /* We need to allocate enough room for decoding the text. */
3244 encoded
= SAFE_ALLOCA (allength
);
3246 encoded_length
= base64_encode_1 (SSDATA (string
),
3247 encoded
, length
, NILP (no_line_break
),
3248 STRING_MULTIBYTE (string
));
3249 if (encoded_length
> allength
)
3252 if (encoded_length
< 0)
3254 /* The encoding wasn't possible. */
3255 error ("Multibyte character in data for base64 encoding");
3258 encoded_string
= make_unibyte_string (encoded
, encoded_length
);
3261 return encoded_string
;
3265 base64_encode_1 (const char *from
, char *to
, ptrdiff_t length
,
3266 bool line_break
, bool multibyte
)
3279 c
= STRING_CHAR_AND_LENGTH ((unsigned char *) from
+ i
, bytes
);
3280 if (CHAR_BYTE8_P (c
))
3281 c
= CHAR_TO_BYTE8 (c
);
3289 /* Wrap line every 76 characters. */
3293 if (counter
< MIME_LINE_LENGTH
/ 4)
3302 /* Process first byte of a triplet. */
3304 *e
++ = base64_value_to_char
[0x3f & c
>> 2];
3305 value
= (0x03 & c
) << 4;
3307 /* Process second byte of a triplet. */
3311 *e
++ = base64_value_to_char
[value
];
3319 c
= STRING_CHAR_AND_LENGTH ((unsigned char *) from
+ i
, bytes
);
3320 if (CHAR_BYTE8_P (c
))
3321 c
= CHAR_TO_BYTE8 (c
);
3329 *e
++ = base64_value_to_char
[value
| (0x0f & c
>> 4)];
3330 value
= (0x0f & c
) << 2;
3332 /* Process third byte of a triplet. */
3336 *e
++ = base64_value_to_char
[value
];
3343 c
= STRING_CHAR_AND_LENGTH ((unsigned char *) from
+ i
, bytes
);
3344 if (CHAR_BYTE8_P (c
))
3345 c
= CHAR_TO_BYTE8 (c
);
3353 *e
++ = base64_value_to_char
[value
| (0x03 & c
>> 6)];
3354 *e
++ = base64_value_to_char
[0x3f & c
];
3361 DEFUN ("base64-decode-region", Fbase64_decode_region
, Sbase64_decode_region
,
3363 doc
: /* Base64-decode the region between BEG and END.
3364 Return the length of the decoded text.
3365 If the region can't be decoded, signal an error and don't modify the buffer. */)
3366 (Lisp_Object beg
, Lisp_Object end
)
3368 ptrdiff_t ibeg
, iend
, length
, allength
;
3370 ptrdiff_t old_pos
= PT
;
3371 ptrdiff_t decoded_length
;
3372 ptrdiff_t inserted_chars
;
3373 bool multibyte
= !NILP (BVAR (current_buffer
, enable_multibyte_characters
));
3376 validate_region (&beg
, &end
);
3378 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
3379 iend
= CHAR_TO_BYTE (XFASTINT (end
));
3381 length
= iend
- ibeg
;
3383 /* We need to allocate enough room for decoding the text. If we are
3384 working on a multibyte buffer, each decoded code may occupy at
3386 allength
= multibyte
? length
* 2 : length
;
3387 decoded
= SAFE_ALLOCA (allength
);
3389 move_gap_both (XFASTINT (beg
), ibeg
);
3390 decoded_length
= base64_decode_1 ((char *) BYTE_POS_ADDR (ibeg
),
3392 multibyte
, &inserted_chars
);
3393 if (decoded_length
> allength
)
3396 if (decoded_length
< 0)
3398 /* The decoding wasn't possible. */
3399 error ("Invalid base64 data");
3402 /* Now we have decoded the region, so we insert the new contents
3403 and delete the old. (Insert first in order to preserve markers.) */
3404 TEMP_SET_PT_BOTH (XFASTINT (beg
), ibeg
);
3405 insert_1_both (decoded
, inserted_chars
, decoded_length
, 0, 1, 0);
3408 /* Delete the original text. */
3409 del_range_both (PT
, PT_BYTE
, XFASTINT (end
) + inserted_chars
,
3410 iend
+ decoded_length
, 1);
3412 /* If point was outside of the region, restore it exactly; else just
3413 move to the beginning of the region. */
3414 if (old_pos
>= XFASTINT (end
))
3415 old_pos
+= inserted_chars
- (XFASTINT (end
) - XFASTINT (beg
));
3416 else if (old_pos
> XFASTINT (beg
))
3417 old_pos
= XFASTINT (beg
);
3418 SET_PT (old_pos
> ZV
? ZV
: old_pos
);
3420 return make_number (inserted_chars
);
3423 DEFUN ("base64-decode-string", Fbase64_decode_string
, Sbase64_decode_string
,
3425 doc
: /* Base64-decode STRING and return the result. */)
3426 (Lisp_Object string
)
3429 ptrdiff_t length
, decoded_length
;
3430 Lisp_Object decoded_string
;
3433 CHECK_STRING (string
);
3435 length
= SBYTES (string
);
3436 /* We need to allocate enough room for decoding the text. */
3437 decoded
= SAFE_ALLOCA (length
);
3439 /* The decoded result should be unibyte. */
3440 decoded_length
= base64_decode_1 (SSDATA (string
), decoded
, length
,
3442 if (decoded_length
> length
)
3444 else if (decoded_length
>= 0)
3445 decoded_string
= make_unibyte_string (decoded
, decoded_length
);
3447 decoded_string
= Qnil
;
3450 if (!STRINGP (decoded_string
))
3451 error ("Invalid base64 data");
3453 return decoded_string
;
3456 /* Base64-decode the data at FROM of LENGTH bytes into TO. If
3457 MULTIBYTE, the decoded result should be in multibyte
3458 form. If NCHARS_RETURN is not NULL, store the number of produced
3459 characters in *NCHARS_RETURN. */
3462 base64_decode_1 (const char *from
, char *to
, ptrdiff_t length
,
3463 bool multibyte
, ptrdiff_t *nchars_return
)
3465 ptrdiff_t i
= 0; /* Used inside READ_QUADRUPLET_BYTE */
3468 unsigned long value
;
3469 ptrdiff_t nchars
= 0;
3473 /* Process first byte of a quadruplet. */
3475 READ_QUADRUPLET_BYTE (e
-to
);
3479 value
= base64_char_to_value
[c
] << 18;
3481 /* Process second byte of a quadruplet. */
3483 READ_QUADRUPLET_BYTE (-1);
3487 value
|= base64_char_to_value
[c
] << 12;
3489 c
= (unsigned char) (value
>> 16);
3490 if (multibyte
&& c
>= 128)
3491 e
+= BYTE8_STRING (c
, e
);
3496 /* Process third byte of a quadruplet. */
3498 READ_QUADRUPLET_BYTE (-1);
3502 READ_QUADRUPLET_BYTE (-1);
3511 value
|= base64_char_to_value
[c
] << 6;
3513 c
= (unsigned char) (0xff & value
>> 8);
3514 if (multibyte
&& c
>= 128)
3515 e
+= BYTE8_STRING (c
, e
);
3520 /* Process fourth byte of a quadruplet. */
3522 READ_QUADRUPLET_BYTE (-1);
3529 value
|= base64_char_to_value
[c
];
3531 c
= (unsigned char) (0xff & value
);
3532 if (multibyte
&& c
>= 128)
3533 e
+= BYTE8_STRING (c
, e
);
3542 /***********************************************************************
3544 ***** Hash Tables *****
3546 ***********************************************************************/
3548 /* Implemented by gerd@gnu.org. This hash table implementation was
3549 inspired by CMUCL hash tables. */
3553 1. For small tables, association lists are probably faster than
3554 hash tables because they have lower overhead.
3556 For uses of hash tables where the O(1) behavior of table
3557 operations is not a requirement, it might therefore be a good idea
3558 not to hash. Instead, we could just do a linear search in the
3559 key_and_value vector of the hash table. This could be done
3560 if a `:linear-search t' argument is given to make-hash-table. */
3563 /* The list of all weak hash tables. Don't staticpro this one. */
3565 static struct Lisp_Hash_Table
*weak_hash_tables
;
3568 /***********************************************************************
3570 ***********************************************************************/
3573 CHECK_HASH_TABLE (Lisp_Object x
)
3575 CHECK_TYPE (HASH_TABLE_P (x
), Qhash_table_p
, x
);
3579 set_hash_key_and_value (struct Lisp_Hash_Table
*h
, Lisp_Object key_and_value
)
3581 h
->key_and_value
= key_and_value
;
3584 set_hash_next (struct Lisp_Hash_Table
*h
, Lisp_Object next
)
3589 set_hash_next_slot (struct Lisp_Hash_Table
*h
, ptrdiff_t idx
, Lisp_Object val
)
3591 gc_aset (h
->next
, idx
, val
);
3594 set_hash_hash (struct Lisp_Hash_Table
*h
, Lisp_Object hash
)
3599 set_hash_hash_slot (struct Lisp_Hash_Table
*h
, ptrdiff_t idx
, Lisp_Object val
)
3601 gc_aset (h
->hash
, idx
, val
);
3604 set_hash_index (struct Lisp_Hash_Table
*h
, Lisp_Object index
)
3609 set_hash_index_slot (struct Lisp_Hash_Table
*h
, ptrdiff_t idx
, Lisp_Object val
)
3611 gc_aset (h
->index
, idx
, val
);
3614 /* If OBJ is a Lisp hash table, return a pointer to its struct
3615 Lisp_Hash_Table. Otherwise, signal an error. */
3617 static struct Lisp_Hash_Table
*
3618 check_hash_table (Lisp_Object obj
)
3620 CHECK_HASH_TABLE (obj
);
3621 return XHASH_TABLE (obj
);
3625 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
3626 number. A number is "almost" a prime number if it is not divisible
3627 by any integer in the range 2 .. (NEXT_ALMOST_PRIME_LIMIT - 1). */
3630 next_almost_prime (EMACS_INT n
)
3632 verify (NEXT_ALMOST_PRIME_LIMIT
== 11);
3633 for (n
|= 1; ; n
+= 2)
3634 if (n
% 3 != 0 && n
% 5 != 0 && n
% 7 != 0)
3639 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
3640 which USED[I] is non-zero. If found at index I in ARGS, set
3641 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
3642 0. This function is used to extract a keyword/argument pair from
3643 a DEFUN parameter list. */
3646 get_key_arg (Lisp_Object key
, ptrdiff_t nargs
, Lisp_Object
*args
, char *used
)
3650 for (i
= 1; i
< nargs
; i
++)
3651 if (!used
[i
- 1] && EQ (args
[i
- 1], key
))
3662 /* Return a Lisp vector which has the same contents as VEC but has
3663 at least INCR_MIN more entries, where INCR_MIN is positive.
3664 If NITEMS_MAX is not -1, do not grow the vector to be any larger
3665 than NITEMS_MAX. Entries in the resulting
3666 vector that are not copied from VEC are set to nil. */
3669 larger_vector (Lisp_Object vec
, ptrdiff_t incr_min
, ptrdiff_t nitems_max
)
3671 struct Lisp_Vector
*v
;
3672 ptrdiff_t incr
, incr_max
, old_size
, new_size
;
3673 ptrdiff_t C_language_max
= min (PTRDIFF_MAX
, SIZE_MAX
) / sizeof *v
->contents
;
3674 ptrdiff_t n_max
= (0 <= nitems_max
&& nitems_max
< C_language_max
3675 ? nitems_max
: C_language_max
);
3676 eassert (VECTORP (vec
));
3677 eassert (0 < incr_min
&& -1 <= nitems_max
);
3678 old_size
= ASIZE (vec
);
3679 incr_max
= n_max
- old_size
;
3680 incr
= max (incr_min
, min (old_size
>> 1, incr_max
));
3681 if (incr_max
< incr
)
3682 memory_full (SIZE_MAX
);
3683 new_size
= old_size
+ incr
;
3684 v
= allocate_vector (new_size
);
3685 memcpy (v
->contents
, XVECTOR (vec
)->contents
, old_size
* sizeof *v
->contents
);
3686 memclear (v
->contents
+ old_size
, incr
* word_size
);
3687 XSETVECTOR (vec
, v
);
3692 /***********************************************************************
3694 ***********************************************************************/
3696 static struct hash_table_test hashtest_eq
;
3697 struct hash_table_test hashtest_eql
, hashtest_equal
;
3699 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3700 HASH2 in hash table H using `eql'. Value is true if KEY1 and
3701 KEY2 are the same. */
3704 cmpfn_eql (struct hash_table_test
*ht
,
3708 return (FLOATP (key1
)
3710 && XFLOAT_DATA (key1
) == XFLOAT_DATA (key2
));
3714 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3715 HASH2 in hash table H using `equal'. Value is true if KEY1 and
3716 KEY2 are the same. */
3719 cmpfn_equal (struct hash_table_test
*ht
,
3723 return !NILP (Fequal (key1
, key2
));
3727 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
3728 HASH2 in hash table H using H->user_cmp_function. Value is true
3729 if KEY1 and KEY2 are the same. */
3732 cmpfn_user_defined (struct hash_table_test
*ht
,
3736 return !NILP (call2 (ht
->user_cmp_function
, key1
, key2
));
3740 /* Value is a hash code for KEY for use in hash table H which uses
3741 `eq' to compare keys. The hash code returned is guaranteed to fit
3742 in a Lisp integer. */
3745 hashfn_eq (struct hash_table_test
*ht
, Lisp_Object key
)
3747 EMACS_UINT hash
= XHASH (key
) ^ XTYPE (key
);
3751 /* Value is a hash code for KEY for use in hash table H which uses
3752 `eql' to compare keys. The hash code returned is guaranteed to fit
3753 in a Lisp integer. */
3756 hashfn_eql (struct hash_table_test
*ht
, Lisp_Object key
)
3760 hash
= sxhash (key
, 0);
3762 hash
= XHASH (key
) ^ XTYPE (key
);
3766 /* Value is a hash code for KEY for use in hash table H which uses
3767 `equal' to compare keys. The hash code returned is guaranteed to fit
3768 in a Lisp integer. */
3771 hashfn_equal (struct hash_table_test
*ht
, Lisp_Object key
)
3773 EMACS_UINT hash
= sxhash (key
, 0);
3777 /* Value is a hash code for KEY for use in hash table H which uses as
3778 user-defined function to compare keys. The hash code returned is
3779 guaranteed to fit in a Lisp integer. */
3782 hashfn_user_defined (struct hash_table_test
*ht
, Lisp_Object key
)
3784 Lisp_Object hash
= call1 (ht
->user_hash_function
, key
);
3785 return hashfn_eq (ht
, hash
);
3788 /* Allocate basically initialized hash table. */
3790 static struct Lisp_Hash_Table
*
3791 allocate_hash_table (void)
3793 return ALLOCATE_PSEUDOVECTOR (struct Lisp_Hash_Table
,
3794 count
, PVEC_HASH_TABLE
);
3797 /* An upper bound on the size of a hash table index. It must fit in
3798 ptrdiff_t and be a valid Emacs fixnum. */
3799 #define INDEX_SIZE_BOUND \
3800 ((ptrdiff_t) min (MOST_POSITIVE_FIXNUM, PTRDIFF_MAX / word_size))
3802 /* Create and initialize a new hash table.
3804 TEST specifies the test the hash table will use to compare keys.
3805 It must be either one of the predefined tests `eq', `eql' or
3806 `equal' or a symbol denoting a user-defined test named TEST with
3807 test and hash functions USER_TEST and USER_HASH.
3809 Give the table initial capacity SIZE, SIZE >= 0, an integer.
3811 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
3812 new size when it becomes full is computed by adding REHASH_SIZE to
3813 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
3814 table's new size is computed by multiplying its old size with
3817 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
3818 be resized when the ratio of (number of entries in the table) /
3819 (table size) is >= REHASH_THRESHOLD.
3821 WEAK specifies the weakness of the table. If non-nil, it must be
3822 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
3825 make_hash_table (struct hash_table_test test
,
3826 Lisp_Object size
, Lisp_Object rehash_size
,
3827 Lisp_Object rehash_threshold
, Lisp_Object weak
)
3829 struct Lisp_Hash_Table
*h
;
3831 EMACS_INT index_size
, sz
;
3835 /* Preconditions. */
3836 eassert (SYMBOLP (test
.name
));
3837 eassert (INTEGERP (size
) && XINT (size
) >= 0);
3838 eassert ((INTEGERP (rehash_size
) && XINT (rehash_size
) > 0)
3839 || (FLOATP (rehash_size
) && 1 < XFLOAT_DATA (rehash_size
)));
3840 eassert (FLOATP (rehash_threshold
)
3841 && 0 < XFLOAT_DATA (rehash_threshold
)
3842 && XFLOAT_DATA (rehash_threshold
) <= 1.0);
3844 if (XFASTINT (size
) == 0)
3845 size
= make_number (1);
3847 sz
= XFASTINT (size
);
3848 index_float
= sz
/ XFLOAT_DATA (rehash_threshold
);
3849 index_size
= (index_float
< INDEX_SIZE_BOUND
+ 1
3850 ? next_almost_prime (index_float
)
3851 : INDEX_SIZE_BOUND
+ 1);
3852 if (INDEX_SIZE_BOUND
< max (index_size
, 2 * sz
))
3853 error ("Hash table too large");
3855 /* Allocate a table and initialize it. */
3856 h
= allocate_hash_table ();
3858 /* Initialize hash table slots. */
3861 h
->rehash_threshold
= rehash_threshold
;
3862 h
->rehash_size
= rehash_size
;
3864 h
->key_and_value
= Fmake_vector (make_number (2 * sz
), Qnil
);
3865 h
->hash
= Fmake_vector (size
, Qnil
);
3866 h
->next
= Fmake_vector (size
, Qnil
);
3867 h
->index
= Fmake_vector (make_number (index_size
), Qnil
);
3869 /* Set up the free list. */
3870 for (i
= 0; i
< sz
- 1; ++i
)
3871 set_hash_next_slot (h
, i
, make_number (i
+ 1));
3872 h
->next_free
= make_number (0);
3874 XSET_HASH_TABLE (table
, h
);
3875 eassert (HASH_TABLE_P (table
));
3876 eassert (XHASH_TABLE (table
) == h
);
3878 /* Maybe add this hash table to the list of all weak hash tables. */
3880 h
->next_weak
= NULL
;
3883 h
->next_weak
= weak_hash_tables
;
3884 weak_hash_tables
= h
;
3891 /* Return a copy of hash table H1. Keys and values are not copied,
3892 only the table itself is. */
3895 copy_hash_table (struct Lisp_Hash_Table
*h1
)
3898 struct Lisp_Hash_Table
*h2
;
3900 h2
= allocate_hash_table ();
3902 h2
->key_and_value
= Fcopy_sequence (h1
->key_and_value
);
3903 h2
->hash
= Fcopy_sequence (h1
->hash
);
3904 h2
->next
= Fcopy_sequence (h1
->next
);
3905 h2
->index
= Fcopy_sequence (h1
->index
);
3906 XSET_HASH_TABLE (table
, h2
);
3908 /* Maybe add this hash table to the list of all weak hash tables. */
3909 if (!NILP (h2
->weak
))
3911 h2
->next_weak
= weak_hash_tables
;
3912 weak_hash_tables
= h2
;
3919 /* Resize hash table H if it's too full. If H cannot be resized
3920 because it's already too large, throw an error. */
3923 maybe_resize_hash_table (struct Lisp_Hash_Table
*h
)
3925 if (NILP (h
->next_free
))
3927 ptrdiff_t old_size
= HASH_TABLE_SIZE (h
);
3928 EMACS_INT new_size
, index_size
, nsize
;
3932 if (INTEGERP (h
->rehash_size
))
3933 new_size
= old_size
+ XFASTINT (h
->rehash_size
);
3936 double float_new_size
= old_size
* XFLOAT_DATA (h
->rehash_size
);
3937 if (float_new_size
< INDEX_SIZE_BOUND
+ 1)
3939 new_size
= float_new_size
;
3940 if (new_size
<= old_size
)
3941 new_size
= old_size
+ 1;
3944 new_size
= INDEX_SIZE_BOUND
+ 1;
3946 index_float
= new_size
/ XFLOAT_DATA (h
->rehash_threshold
);
3947 index_size
= (index_float
< INDEX_SIZE_BOUND
+ 1
3948 ? next_almost_prime (index_float
)
3949 : INDEX_SIZE_BOUND
+ 1);
3950 nsize
= max (index_size
, 2 * new_size
);
3951 if (INDEX_SIZE_BOUND
< nsize
)
3952 error ("Hash table too large to resize");
3954 #ifdef ENABLE_CHECKING
3955 if (HASH_TABLE_P (Vpurify_flag
)
3956 && XHASH_TABLE (Vpurify_flag
) == h
)
3957 message ("Growing hash table to: %"pI
"d", new_size
);
3960 set_hash_key_and_value (h
, larger_vector (h
->key_and_value
,
3961 2 * (new_size
- old_size
), -1));
3962 set_hash_next (h
, larger_vector (h
->next
, new_size
- old_size
, -1));
3963 set_hash_hash (h
, larger_vector (h
->hash
, new_size
- old_size
, -1));
3964 set_hash_index (h
, Fmake_vector (make_number (index_size
), Qnil
));
3966 /* Update the free list. Do it so that new entries are added at
3967 the end of the free list. This makes some operations like
3969 for (i
= old_size
; i
< new_size
- 1; ++i
)
3970 set_hash_next_slot (h
, i
, make_number (i
+ 1));
3972 if (!NILP (h
->next_free
))
3974 Lisp_Object last
, next
;
3976 last
= h
->next_free
;
3977 while (next
= HASH_NEXT (h
, XFASTINT (last
)),
3981 set_hash_next_slot (h
, XFASTINT (last
), make_number (old_size
));
3984 XSETFASTINT (h
->next_free
, old_size
);
3987 for (i
= 0; i
< old_size
; ++i
)
3988 if (!NILP (HASH_HASH (h
, i
)))
3990 EMACS_UINT hash_code
= XUINT (HASH_HASH (h
, i
));
3991 ptrdiff_t start_of_bucket
= hash_code
% ASIZE (h
->index
);
3992 set_hash_next_slot (h
, i
, HASH_INDEX (h
, start_of_bucket
));
3993 set_hash_index_slot (h
, start_of_bucket
, make_number (i
));
3999 /* Lookup KEY in hash table H. If HASH is non-null, return in *HASH
4000 the hash code of KEY. Value is the index of the entry in H
4001 matching KEY, or -1 if not found. */
4004 hash_lookup (struct Lisp_Hash_Table
*h
, Lisp_Object key
, EMACS_UINT
*hash
)
4006 EMACS_UINT hash_code
;
4007 ptrdiff_t start_of_bucket
;
4010 hash_code
= h
->test
.hashfn (&h
->test
, key
);
4011 eassert ((hash_code
& ~INTMASK
) == 0);
4015 start_of_bucket
= hash_code
% ASIZE (h
->index
);
4016 idx
= HASH_INDEX (h
, start_of_bucket
);
4018 /* We need not gcpro idx since it's either an integer or nil. */
4021 ptrdiff_t i
= XFASTINT (idx
);
4022 if (EQ (key
, HASH_KEY (h
, i
))
4024 && hash_code
== XUINT (HASH_HASH (h
, i
))
4025 && h
->test
.cmpfn (&h
->test
, key
, HASH_KEY (h
, i
))))
4027 idx
= HASH_NEXT (h
, i
);
4030 return NILP (idx
) ? -1 : XFASTINT (idx
);
4034 /* Put an entry into hash table H that associates KEY with VALUE.
4035 HASH is a previously computed hash code of KEY.
4036 Value is the index of the entry in H matching KEY. */
4039 hash_put (struct Lisp_Hash_Table
*h
, Lisp_Object key
, Lisp_Object value
,
4042 ptrdiff_t start_of_bucket
, i
;
4044 eassert ((hash
& ~INTMASK
) == 0);
4046 /* Increment count after resizing because resizing may fail. */
4047 maybe_resize_hash_table (h
);
4050 /* Store key/value in the key_and_value vector. */
4051 i
= XFASTINT (h
->next_free
);
4052 h
->next_free
= HASH_NEXT (h
, i
);
4053 set_hash_key_slot (h
, i
, key
);
4054 set_hash_value_slot (h
, i
, value
);
4056 /* Remember its hash code. */
4057 set_hash_hash_slot (h
, i
, make_number (hash
));
4059 /* Add new entry to its collision chain. */
4060 start_of_bucket
= hash
% ASIZE (h
->index
);
4061 set_hash_next_slot (h
, i
, HASH_INDEX (h
, start_of_bucket
));
4062 set_hash_index_slot (h
, start_of_bucket
, make_number (i
));
4067 /* Remove the entry matching KEY from hash table H, if there is one. */
4070 hash_remove_from_table (struct Lisp_Hash_Table
*h
, Lisp_Object key
)
4072 EMACS_UINT hash_code
;
4073 ptrdiff_t start_of_bucket
;
4074 Lisp_Object idx
, prev
;
4076 hash_code
= h
->test
.hashfn (&h
->test
, key
);
4077 eassert ((hash_code
& ~INTMASK
) == 0);
4078 start_of_bucket
= hash_code
% ASIZE (h
->index
);
4079 idx
= HASH_INDEX (h
, start_of_bucket
);
4082 /* We need not gcpro idx, prev since they're either integers or nil. */
4085 ptrdiff_t i
= XFASTINT (idx
);
4087 if (EQ (key
, HASH_KEY (h
, i
))
4089 && hash_code
== XUINT (HASH_HASH (h
, i
))
4090 && h
->test
.cmpfn (&h
->test
, key
, HASH_KEY (h
, i
))))
4092 /* Take entry out of collision chain. */
4094 set_hash_index_slot (h
, start_of_bucket
, HASH_NEXT (h
, i
));
4096 set_hash_next_slot (h
, XFASTINT (prev
), HASH_NEXT (h
, i
));
4098 /* Clear slots in key_and_value and add the slots to
4100 set_hash_key_slot (h
, i
, Qnil
);
4101 set_hash_value_slot (h
, i
, Qnil
);
4102 set_hash_hash_slot (h
, i
, Qnil
);
4103 set_hash_next_slot (h
, i
, h
->next_free
);
4104 h
->next_free
= make_number (i
);
4106 eassert (h
->count
>= 0);
4112 idx
= HASH_NEXT (h
, i
);
4118 /* Clear hash table H. */
4121 hash_clear (struct Lisp_Hash_Table
*h
)
4125 ptrdiff_t i
, size
= HASH_TABLE_SIZE (h
);
4127 for (i
= 0; i
< size
; ++i
)
4129 set_hash_next_slot (h
, i
, i
< size
- 1 ? make_number (i
+ 1) : Qnil
);
4130 set_hash_key_slot (h
, i
, Qnil
);
4131 set_hash_value_slot (h
, i
, Qnil
);
4132 set_hash_hash_slot (h
, i
, Qnil
);
4135 for (i
= 0; i
< ASIZE (h
->index
); ++i
)
4136 ASET (h
->index
, i
, Qnil
);
4138 h
->next_free
= make_number (0);
4145 /************************************************************************
4147 ************************************************************************/
4149 /* Sweep weak hash table H. REMOVE_ENTRIES_P means remove
4150 entries from the table that don't survive the current GC.
4151 !REMOVE_ENTRIES_P means mark entries that are in use. Value is
4152 true if anything was marked. */
4155 sweep_weak_table (struct Lisp_Hash_Table
*h
, bool remove_entries_p
)
4157 ptrdiff_t bucket
, n
;
4160 n
= ASIZE (h
->index
) & ~ARRAY_MARK_FLAG
;
4163 for (bucket
= 0; bucket
< n
; ++bucket
)
4165 Lisp_Object idx
, next
, prev
;
4167 /* Follow collision chain, removing entries that
4168 don't survive this garbage collection. */
4170 for (idx
= HASH_INDEX (h
, bucket
); !NILP (idx
); idx
= next
)
4172 ptrdiff_t i
= XFASTINT (idx
);
4173 bool key_known_to_survive_p
= survives_gc_p (HASH_KEY (h
, i
));
4174 bool value_known_to_survive_p
= survives_gc_p (HASH_VALUE (h
, i
));
4177 if (EQ (h
->weak
, Qkey
))
4178 remove_p
= !key_known_to_survive_p
;
4179 else if (EQ (h
->weak
, Qvalue
))
4180 remove_p
= !value_known_to_survive_p
;
4181 else if (EQ (h
->weak
, Qkey_or_value
))
4182 remove_p
= !(key_known_to_survive_p
|| value_known_to_survive_p
);
4183 else if (EQ (h
->weak
, Qkey_and_value
))
4184 remove_p
= !(key_known_to_survive_p
&& value_known_to_survive_p
);
4188 next
= HASH_NEXT (h
, i
);
4190 if (remove_entries_p
)
4194 /* Take out of collision chain. */
4196 set_hash_index_slot (h
, bucket
, next
);
4198 set_hash_next_slot (h
, XFASTINT (prev
), next
);
4200 /* Add to free list. */
4201 set_hash_next_slot (h
, i
, h
->next_free
);
4204 /* Clear key, value, and hash. */
4205 set_hash_key_slot (h
, i
, Qnil
);
4206 set_hash_value_slot (h
, i
, Qnil
);
4207 set_hash_hash_slot (h
, i
, Qnil
);
4220 /* Make sure key and value survive. */
4221 if (!key_known_to_survive_p
)
4223 mark_object (HASH_KEY (h
, i
));
4227 if (!value_known_to_survive_p
)
4229 mark_object (HASH_VALUE (h
, i
));
4240 /* Remove elements from weak hash tables that don't survive the
4241 current garbage collection. Remove weak tables that don't survive
4242 from Vweak_hash_tables. Called from gc_sweep. */
4244 NO_INLINE
/* For better stack traces */
4246 sweep_weak_hash_tables (void)
4248 struct Lisp_Hash_Table
*h
, *used
, *next
;
4251 /* Mark all keys and values that are in use. Keep on marking until
4252 there is no more change. This is necessary for cases like
4253 value-weak table A containing an entry X -> Y, where Y is used in a
4254 key-weak table B, Z -> Y. If B comes after A in the list of weak
4255 tables, X -> Y might be removed from A, although when looking at B
4256 one finds that it shouldn't. */
4260 for (h
= weak_hash_tables
; h
; h
= h
->next_weak
)
4262 if (h
->header
.size
& ARRAY_MARK_FLAG
)
4263 marked
|= sweep_weak_table (h
, 0);
4268 /* Remove tables and entries that aren't used. */
4269 for (h
= weak_hash_tables
, used
= NULL
; h
; h
= next
)
4271 next
= h
->next_weak
;
4273 if (h
->header
.size
& ARRAY_MARK_FLAG
)
4275 /* TABLE is marked as used. Sweep its contents. */
4277 sweep_weak_table (h
, 1);
4279 /* Add table to the list of used weak hash tables. */
4280 h
->next_weak
= used
;
4285 weak_hash_tables
= used
;
4290 /***********************************************************************
4291 Hash Code Computation
4292 ***********************************************************************/
4294 /* Maximum depth up to which to dive into Lisp structures. */
4296 #define SXHASH_MAX_DEPTH 3
4298 /* Maximum length up to which to take list and vector elements into
4301 #define SXHASH_MAX_LEN 7
4303 /* Return a hash for string PTR which has length LEN. The hash value
4304 can be any EMACS_UINT value. */
4307 hash_string (char const *ptr
, ptrdiff_t len
)
4309 char const *p
= ptr
;
4310 char const *end
= p
+ len
;
4312 EMACS_UINT hash
= 0;
4317 hash
= sxhash_combine (hash
, c
);
4323 /* Return a hash for string PTR which has length LEN. The hash
4324 code returned is guaranteed to fit in a Lisp integer. */
4327 sxhash_string (char const *ptr
, ptrdiff_t len
)
4329 EMACS_UINT hash
= hash_string (ptr
, len
);
4330 return SXHASH_REDUCE (hash
);
4333 /* Return a hash for the floating point value VAL. */
4336 sxhash_float (double val
)
4338 EMACS_UINT hash
= 0;
4340 WORDS_PER_DOUBLE
= (sizeof val
/ sizeof hash
4341 + (sizeof val
% sizeof hash
!= 0))
4345 EMACS_UINT word
[WORDS_PER_DOUBLE
];
4349 memset (&u
.val
+ 1, 0, sizeof u
- sizeof u
.val
);
4350 for (i
= 0; i
< WORDS_PER_DOUBLE
; i
++)
4351 hash
= sxhash_combine (hash
, u
.word
[i
]);
4352 return SXHASH_REDUCE (hash
);
4355 /* Return a hash for list LIST. DEPTH is the current depth in the
4356 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
4359 sxhash_list (Lisp_Object list
, int depth
)
4361 EMACS_UINT hash
= 0;
4364 if (depth
< SXHASH_MAX_DEPTH
)
4366 CONSP (list
) && i
< SXHASH_MAX_LEN
;
4367 list
= XCDR (list
), ++i
)
4369 EMACS_UINT hash2
= sxhash (XCAR (list
), depth
+ 1);
4370 hash
= sxhash_combine (hash
, hash2
);
4375 EMACS_UINT hash2
= sxhash (list
, depth
+ 1);
4376 hash
= sxhash_combine (hash
, hash2
);
4379 return SXHASH_REDUCE (hash
);
4383 /* Return a hash for vector VECTOR. DEPTH is the current depth in
4384 the Lisp structure. */
4387 sxhash_vector (Lisp_Object vec
, int depth
)
4389 EMACS_UINT hash
= ASIZE (vec
);
4392 n
= min (SXHASH_MAX_LEN
, ASIZE (vec
));
4393 for (i
= 0; i
< n
; ++i
)
4395 EMACS_UINT hash2
= sxhash (AREF (vec
, i
), depth
+ 1);
4396 hash
= sxhash_combine (hash
, hash2
);
4399 return SXHASH_REDUCE (hash
);
4402 /* Return a hash for bool-vector VECTOR. */
4405 sxhash_bool_vector (Lisp_Object vec
)
4407 EMACS_INT size
= bool_vector_size (vec
);
4408 EMACS_UINT hash
= size
;
4411 n
= min (SXHASH_MAX_LEN
, bool_vector_words (size
));
4412 for (i
= 0; i
< n
; ++i
)
4413 hash
= sxhash_combine (hash
, bool_vector_data (vec
)[i
]);
4415 return SXHASH_REDUCE (hash
);
4419 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
4420 structure. Value is an unsigned integer clipped to INTMASK. */
4423 sxhash (Lisp_Object obj
, int depth
)
4427 if (depth
> SXHASH_MAX_DEPTH
)
4430 switch (XTYPE (obj
))
4442 hash
= sxhash_string (SSDATA (obj
), SBYTES (obj
));
4445 /* This can be everything from a vector to an overlay. */
4446 case Lisp_Vectorlike
:
4448 /* According to the CL HyperSpec, two arrays are equal only if
4449 they are `eq', except for strings and bit-vectors. In
4450 Emacs, this works differently. We have to compare element
4452 hash
= sxhash_vector (obj
, depth
);
4453 else if (BOOL_VECTOR_P (obj
))
4454 hash
= sxhash_bool_vector (obj
);
4456 /* Others are `equal' if they are `eq', so let's take their
4462 hash
= sxhash_list (obj
, depth
);
4466 hash
= sxhash_float (XFLOAT_DATA (obj
));
4478 /***********************************************************************
4480 ***********************************************************************/
4483 DEFUN ("sxhash", Fsxhash
, Ssxhash
, 1, 1, 0,
4484 doc
: /* Compute a hash code for OBJ and return it as integer. */)
4487 EMACS_UINT hash
= sxhash (obj
, 0);
4488 return make_number (hash
);
4492 DEFUN ("make-hash-table", Fmake_hash_table
, Smake_hash_table
, 0, MANY
, 0,
4493 doc
: /* Create and return a new hash table.
4495 Arguments are specified as keyword/argument pairs. The following
4496 arguments are defined:
4498 :test TEST -- TEST must be a symbol that specifies how to compare
4499 keys. Default is `eql'. Predefined are the tests `eq', `eql', and
4500 `equal'. User-supplied test and hash functions can be specified via
4501 `define-hash-table-test'.
4503 :size SIZE -- A hint as to how many elements will be put in the table.
4506 :rehash-size REHASH-SIZE - Indicates how to expand the table when it
4507 fills up. If REHASH-SIZE is an integer, increase the size by that
4508 amount. If it is a float, it must be > 1.0, and the new size is the
4509 old size multiplied by that factor. Default is 1.5.
4511 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.
4512 Resize the hash table when the ratio (number of entries / table size)
4513 is greater than or equal to THRESHOLD. Default is 0.8.
4515 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',
4516 `key-or-value', or `key-and-value'. If WEAK is not nil, the table
4517 returned is a weak table. Key/value pairs are removed from a weak
4518 hash table when there are no non-weak references pointing to their
4519 key, value, one of key or value, or both key and value, depending on
4520 WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
4523 usage: (make-hash-table &rest KEYWORD-ARGS) */)
4524 (ptrdiff_t nargs
, Lisp_Object
*args
)
4526 Lisp_Object test
, size
, rehash_size
, rehash_threshold
, weak
;
4527 struct hash_table_test testdesc
;
4531 /* The vector `used' is used to keep track of arguments that
4532 have been consumed. */
4533 char *used
= SAFE_ALLOCA (nargs
* sizeof *used
);
4534 memset (used
, 0, nargs
* sizeof *used
);
4536 /* See if there's a `:test TEST' among the arguments. */
4537 i
= get_key_arg (QCtest
, nargs
, args
, used
);
4538 test
= i
? args
[i
] : Qeql
;
4540 testdesc
= hashtest_eq
;
4541 else if (EQ (test
, Qeql
))
4542 testdesc
= hashtest_eql
;
4543 else if (EQ (test
, Qequal
))
4544 testdesc
= hashtest_equal
;
4547 /* See if it is a user-defined test. */
4550 prop
= Fget (test
, Qhash_table_test
);
4551 if (!CONSP (prop
) || !CONSP (XCDR (prop
)))
4552 signal_error ("Invalid hash table test", test
);
4553 testdesc
.name
= test
;
4554 testdesc
.user_cmp_function
= XCAR (prop
);
4555 testdesc
.user_hash_function
= XCAR (XCDR (prop
));
4556 testdesc
.hashfn
= hashfn_user_defined
;
4557 testdesc
.cmpfn
= cmpfn_user_defined
;
4560 /* See if there's a `:size SIZE' argument. */
4561 i
= get_key_arg (QCsize
, nargs
, args
, used
);
4562 size
= i
? args
[i
] : Qnil
;
4564 size
= make_number (DEFAULT_HASH_SIZE
);
4565 else if (!INTEGERP (size
) || XINT (size
) < 0)
4566 signal_error ("Invalid hash table size", size
);
4568 /* Look for `:rehash-size SIZE'. */
4569 i
= get_key_arg (QCrehash_size
, nargs
, args
, used
);
4570 rehash_size
= i
? args
[i
] : make_float (DEFAULT_REHASH_SIZE
);
4571 if (! ((INTEGERP (rehash_size
) && 0 < XINT (rehash_size
))
4572 || (FLOATP (rehash_size
) && 1 < XFLOAT_DATA (rehash_size
))))
4573 signal_error ("Invalid hash table rehash size", rehash_size
);
4575 /* Look for `:rehash-threshold THRESHOLD'. */
4576 i
= get_key_arg (QCrehash_threshold
, nargs
, args
, used
);
4577 rehash_threshold
= i
? args
[i
] : make_float (DEFAULT_REHASH_THRESHOLD
);
4578 if (! (FLOATP (rehash_threshold
)
4579 && 0 < XFLOAT_DATA (rehash_threshold
)
4580 && XFLOAT_DATA (rehash_threshold
) <= 1))
4581 signal_error ("Invalid hash table rehash threshold", rehash_threshold
);
4583 /* Look for `:weakness WEAK'. */
4584 i
= get_key_arg (QCweakness
, nargs
, args
, used
);
4585 weak
= i
? args
[i
] : Qnil
;
4587 weak
= Qkey_and_value
;
4590 && !EQ (weak
, Qvalue
)
4591 && !EQ (weak
, Qkey_or_value
)
4592 && !EQ (weak
, Qkey_and_value
))
4593 signal_error ("Invalid hash table weakness", weak
);
4595 /* Now, all args should have been used up, or there's a problem. */
4596 for (i
= 0; i
< nargs
; ++i
)
4598 signal_error ("Invalid argument list", args
[i
]);
4601 return make_hash_table (testdesc
, size
, rehash_size
, rehash_threshold
, weak
);
4605 DEFUN ("copy-hash-table", Fcopy_hash_table
, Scopy_hash_table
, 1, 1, 0,
4606 doc
: /* Return a copy of hash table TABLE. */)
4609 return copy_hash_table (check_hash_table (table
));
4613 DEFUN ("hash-table-count", Fhash_table_count
, Shash_table_count
, 1, 1, 0,
4614 doc
: /* Return the number of elements in TABLE. */)
4617 return make_number (check_hash_table (table
)->count
);
4621 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size
,
4622 Shash_table_rehash_size
, 1, 1, 0,
4623 doc
: /* Return the current rehash size of TABLE. */)
4626 return check_hash_table (table
)->rehash_size
;
4630 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold
,
4631 Shash_table_rehash_threshold
, 1, 1, 0,
4632 doc
: /* Return the current rehash threshold of TABLE. */)
4635 return check_hash_table (table
)->rehash_threshold
;
4639 DEFUN ("hash-table-size", Fhash_table_size
, Shash_table_size
, 1, 1, 0,
4640 doc
: /* Return the size of TABLE.
4641 The size can be used as an argument to `make-hash-table' to create
4642 a hash table than can hold as many elements as TABLE holds
4643 without need for resizing. */)
4646 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4647 return make_number (HASH_TABLE_SIZE (h
));
4651 DEFUN ("hash-table-test", Fhash_table_test
, Shash_table_test
, 1, 1, 0,
4652 doc
: /* Return the test TABLE uses. */)
4655 return check_hash_table (table
)->test
.name
;
4659 DEFUN ("hash-table-weakness", Fhash_table_weakness
, Shash_table_weakness
,
4661 doc
: /* Return the weakness of TABLE. */)
4664 return check_hash_table (table
)->weak
;
4668 DEFUN ("hash-table-p", Fhash_table_p
, Shash_table_p
, 1, 1, 0,
4669 doc
: /* Return t if OBJ is a Lisp hash table object. */)
4672 return HASH_TABLE_P (obj
) ? Qt
: Qnil
;
4676 DEFUN ("clrhash", Fclrhash
, Sclrhash
, 1, 1, 0,
4677 doc
: /* Clear hash table TABLE and return it. */)
4680 hash_clear (check_hash_table (table
));
4681 /* Be compatible with XEmacs. */
4686 DEFUN ("gethash", Fgethash
, Sgethash
, 2, 3, 0,
4687 doc
: /* Look up KEY in TABLE and return its associated value.
4688 If KEY is not found, return DFLT which defaults to nil. */)
4689 (Lisp_Object key
, Lisp_Object table
, Lisp_Object dflt
)
4691 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4692 ptrdiff_t i
= hash_lookup (h
, key
, NULL
);
4693 return i
>= 0 ? HASH_VALUE (h
, i
) : dflt
;
4697 DEFUN ("puthash", Fputhash
, Sputhash
, 3, 3, 0,
4698 doc
: /* Associate KEY with VALUE in hash table TABLE.
4699 If KEY is already present in table, replace its current value with
4700 VALUE. In any case, return VALUE. */)
4701 (Lisp_Object key
, Lisp_Object value
, Lisp_Object table
)
4703 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4707 i
= hash_lookup (h
, key
, &hash
);
4709 set_hash_value_slot (h
, i
, value
);
4711 hash_put (h
, key
, value
, hash
);
4717 DEFUN ("remhash", Fremhash
, Sremhash
, 2, 2, 0,
4718 doc
: /* Remove KEY from TABLE. */)
4719 (Lisp_Object key
, Lisp_Object table
)
4721 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4722 hash_remove_from_table (h
, key
);
4727 DEFUN ("maphash", Fmaphash
, Smaphash
, 2, 2, 0,
4728 doc
: /* Call FUNCTION for all entries in hash table TABLE.
4729 FUNCTION is called with two arguments, KEY and VALUE.
4730 `maphash' always returns nil. */)
4731 (Lisp_Object function
, Lisp_Object table
)
4733 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4735 for (ptrdiff_t i
= 0; i
< HASH_TABLE_SIZE (h
); ++i
)
4736 if (!NILP (HASH_HASH (h
, i
)))
4737 call2 (function
, HASH_KEY (h
, i
), HASH_VALUE (h
, i
));
4743 DEFUN ("define-hash-table-test", Fdefine_hash_table_test
,
4744 Sdefine_hash_table_test
, 3, 3, 0,
4745 doc
: /* Define a new hash table test with name NAME, a symbol.
4747 In hash tables created with NAME specified as test, use TEST to
4748 compare keys, and HASH for computing hash codes of keys.
4750 TEST must be a function taking two arguments and returning non-nil if
4751 both arguments are the same. HASH must be a function taking one
4752 argument and returning an object that is the hash code of the argument.
4753 It should be the case that if (eq (funcall HASH x1) (funcall HASH x2))
4754 returns nil, then (funcall TEST x1 x2) also returns nil. */)
4755 (Lisp_Object name
, Lisp_Object test
, Lisp_Object hash
)
4757 return Fput (name
, Qhash_table_test
, list2 (test
, hash
));
4762 /************************************************************************
4763 MD5, SHA-1, and SHA-2
4764 ************************************************************************/
4771 /* ALGORITHM is a symbol: md5, sha1, sha224 and so on. */
4774 secure_hash (Lisp_Object algorithm
, Lisp_Object object
, Lisp_Object start
,
4775 Lisp_Object end
, Lisp_Object coding_system
, Lisp_Object noerror
,
4779 ptrdiff_t size
, start_char
= 0, start_byte
, end_char
= 0, end_byte
;
4780 register EMACS_INT b
, e
;
4781 register struct buffer
*bp
;
4784 void *(*hash_func
) (const char *, size_t, void *);
4787 CHECK_SYMBOL (algorithm
);
4789 if (STRINGP (object
))
4791 if (NILP (coding_system
))
4793 /* Decide the coding-system to encode the data with. */
4795 if (STRING_MULTIBYTE (object
))
4796 /* use default, we can't guess correct value */
4797 coding_system
= preferred_coding_system ();
4799 coding_system
= Qraw_text
;
4802 if (NILP (Fcoding_system_p (coding_system
)))
4804 /* Invalid coding system. */
4806 if (!NILP (noerror
))
4807 coding_system
= Qraw_text
;
4809 xsignal1 (Qcoding_system_error
, coding_system
);
4812 if (STRING_MULTIBYTE (object
))
4813 object
= code_convert_string (object
, coding_system
, Qnil
, 1, 0, 1);
4815 size
= SCHARS (object
);
4816 validate_subarray (object
, start
, end
, size
, &start_char
, &end_char
);
4818 start_byte
= !start_char
? 0 : string_char_to_byte (object
, start_char
);
4819 end_byte
= (end_char
== size
4821 : string_char_to_byte (object
, end_char
));
4825 struct buffer
*prev
= current_buffer
;
4827 record_unwind_current_buffer ();
4829 CHECK_BUFFER (object
);
4831 bp
= XBUFFER (object
);
4832 set_buffer_internal (bp
);
4838 CHECK_NUMBER_COERCE_MARKER (start
);
4846 CHECK_NUMBER_COERCE_MARKER (end
);
4851 temp
= b
, b
= e
, e
= temp
;
4853 if (!(BEGV
<= b
&& e
<= ZV
))
4854 args_out_of_range (start
, end
);
4856 if (NILP (coding_system
))
4858 /* Decide the coding-system to encode the data with.
4859 See fileio.c:Fwrite-region */
4861 if (!NILP (Vcoding_system_for_write
))
4862 coding_system
= Vcoding_system_for_write
;
4865 bool force_raw_text
= 0;
4867 coding_system
= BVAR (XBUFFER (object
), buffer_file_coding_system
);
4868 if (NILP (coding_system
)
4869 || NILP (Flocal_variable_p (Qbuffer_file_coding_system
, Qnil
)))
4871 coding_system
= Qnil
;
4872 if (NILP (BVAR (current_buffer
, enable_multibyte_characters
)))
4876 if (NILP (coding_system
) && !NILP (Fbuffer_file_name (object
)))
4878 /* Check file-coding-system-alist. */
4879 Lisp_Object val
= CALLN (Ffind_operation_coding_system
,
4880 Qwrite_region
, start
, end
,
4881 Fbuffer_file_name (object
));
4882 if (CONSP (val
) && !NILP (XCDR (val
)))
4883 coding_system
= XCDR (val
);
4886 if (NILP (coding_system
)
4887 && !NILP (BVAR (XBUFFER (object
), buffer_file_coding_system
)))
4889 /* If we still have not decided a coding system, use the
4890 default value of buffer-file-coding-system. */
4891 coding_system
= BVAR (XBUFFER (object
), buffer_file_coding_system
);
4895 && !NILP (Ffboundp (Vselect_safe_coding_system_function
)))
4896 /* Confirm that VAL can surely encode the current region. */
4897 coding_system
= call4 (Vselect_safe_coding_system_function
,
4898 make_number (b
), make_number (e
),
4899 coding_system
, Qnil
);
4902 coding_system
= Qraw_text
;
4905 if (NILP (Fcoding_system_p (coding_system
)))
4907 /* Invalid coding system. */
4909 if (!NILP (noerror
))
4910 coding_system
= Qraw_text
;
4912 xsignal1 (Qcoding_system_error
, coding_system
);
4916 object
= make_buffer_string (b
, e
, 0);
4917 set_buffer_internal (prev
);
4918 /* Discard the unwind protect for recovering the current
4922 if (STRING_MULTIBYTE (object
))
4923 object
= code_convert_string (object
, coding_system
, Qnil
, 1, 0, 0);
4925 end_byte
= SBYTES (object
);
4928 if (EQ (algorithm
, Qmd5
))
4930 digest_size
= MD5_DIGEST_SIZE
;
4931 hash_func
= md5_buffer
;
4933 else if (EQ (algorithm
, Qsha1
))
4935 digest_size
= SHA1_DIGEST_SIZE
;
4936 hash_func
= sha1_buffer
;
4938 else if (EQ (algorithm
, Qsha224
))
4940 digest_size
= SHA224_DIGEST_SIZE
;
4941 hash_func
= sha224_buffer
;
4943 else if (EQ (algorithm
, Qsha256
))
4945 digest_size
= SHA256_DIGEST_SIZE
;
4946 hash_func
= sha256_buffer
;
4948 else if (EQ (algorithm
, Qsha384
))
4950 digest_size
= SHA384_DIGEST_SIZE
;
4951 hash_func
= sha384_buffer
;
4953 else if (EQ (algorithm
, Qsha512
))
4955 digest_size
= SHA512_DIGEST_SIZE
;
4956 hash_func
= sha512_buffer
;
4959 error ("Invalid algorithm arg: %s", SDATA (Fsymbol_name (algorithm
)));
4961 /* allocate 2 x digest_size so that it can be re-used to hold the
4963 digest
= make_uninit_string (digest_size
* 2);
4965 hash_func (SSDATA (object
) + start_byte
,
4966 end_byte
- start_byte
,
4971 unsigned char *p
= SDATA (digest
);
4972 for (i
= digest_size
- 1; i
>= 0; i
--)
4974 static char const hexdigit
[16] = "0123456789abcdef";
4976 p
[2 * i
] = hexdigit
[p_i
>> 4];
4977 p
[2 * i
+ 1] = hexdigit
[p_i
& 0xf];
4982 return make_unibyte_string (SSDATA (digest
), digest_size
);
4985 DEFUN ("md5", Fmd5
, Smd5
, 1, 5, 0,
4986 doc
: /* Return MD5 message digest of OBJECT, a buffer or string.
4988 A message digest is a cryptographic checksum of a document, and the
4989 algorithm to calculate it is defined in RFC 1321.
4991 The two optional arguments START and END are character positions
4992 specifying for which part of OBJECT the message digest should be
4993 computed. If nil or omitted, the digest is computed for the whole
4996 The MD5 message digest is computed from the result of encoding the
4997 text in a coding system, not directly from the internal Emacs form of
4998 the text. The optional fourth argument CODING-SYSTEM specifies which
4999 coding system to encode the text with. It should be the same coding
5000 system that you used or will use when actually writing the text into a
5003 If CODING-SYSTEM is nil or omitted, the default depends on OBJECT. If
5004 OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
5005 system would be chosen by default for writing this text into a file.
5007 If OBJECT is a string, the most preferred coding system (see the
5008 command `prefer-coding-system') is used.
5010 If NOERROR is non-nil, silently assume the `raw-text' coding if the
5011 guesswork fails. Normally, an error is signaled in such case. */)
5012 (Lisp_Object object
, Lisp_Object start
, Lisp_Object end
, Lisp_Object coding_system
, Lisp_Object noerror
)
5014 return secure_hash (Qmd5
, object
, start
, end
, coding_system
, noerror
, Qnil
);
5017 DEFUN ("secure-hash", Fsecure_hash
, Ssecure_hash
, 2, 5, 0,
5018 doc
: /* Return the secure hash of OBJECT, a buffer or string.
5019 ALGORITHM is a symbol specifying the hash to use:
5020 md5, sha1, sha224, sha256, sha384 or sha512.
5022 The two optional arguments START and END are positions specifying for
5023 which part of OBJECT to compute the hash. If nil or omitted, uses the
5026 If BINARY is non-nil, returns a string in binary form. */)
5027 (Lisp_Object algorithm
, Lisp_Object object
, Lisp_Object start
, Lisp_Object end
, Lisp_Object binary
)
5029 return secure_hash (algorithm
, object
, start
, end
, Qnil
, Qnil
, binary
);
5035 DEFSYM (Qmd5
, "md5");
5036 DEFSYM (Qsha1
, "sha1");
5037 DEFSYM (Qsha224
, "sha224");
5038 DEFSYM (Qsha256
, "sha256");
5039 DEFSYM (Qsha384
, "sha384");
5040 DEFSYM (Qsha512
, "sha512");
5042 /* Hash table stuff. */
5043 DEFSYM (Qhash_table_p
, "hash-table-p");
5045 DEFSYM (Qeql
, "eql");
5046 DEFSYM (Qequal
, "equal");
5047 DEFSYM (QCtest
, ":test");
5048 DEFSYM (QCsize
, ":size");
5049 DEFSYM (QCrehash_size
, ":rehash-size");
5050 DEFSYM (QCrehash_threshold
, ":rehash-threshold");
5051 DEFSYM (QCweakness
, ":weakness");
5052 DEFSYM (Qkey
, "key");
5053 DEFSYM (Qvalue
, "value");
5054 DEFSYM (Qhash_table_test
, "hash-table-test");
5055 DEFSYM (Qkey_or_value
, "key-or-value");
5056 DEFSYM (Qkey_and_value
, "key-and-value");
5059 defsubr (&Smake_hash_table
);
5060 defsubr (&Scopy_hash_table
);
5061 defsubr (&Shash_table_count
);
5062 defsubr (&Shash_table_rehash_size
);
5063 defsubr (&Shash_table_rehash_threshold
);
5064 defsubr (&Shash_table_size
);
5065 defsubr (&Shash_table_test
);
5066 defsubr (&Shash_table_weakness
);
5067 defsubr (&Shash_table_p
);
5068 defsubr (&Sclrhash
);
5069 defsubr (&Sgethash
);
5070 defsubr (&Sputhash
);
5071 defsubr (&Sremhash
);
5072 defsubr (&Smaphash
);
5073 defsubr (&Sdefine_hash_table_test
);
5075 DEFSYM (Qstring_lessp
, "string-lessp");
5076 DEFSYM (Qprovide
, "provide");
5077 DEFSYM (Qrequire
, "require");
5078 DEFSYM (Qyes_or_no_p_history
, "yes-or-no-p-history");
5079 DEFSYM (Qcursor_in_echo_area
, "cursor-in-echo-area");
5080 DEFSYM (Qwidget_type
, "widget-type");
5082 staticpro (&string_char_byte_cache_string
);
5083 string_char_byte_cache_string
= Qnil
;
5085 require_nesting_list
= Qnil
;
5086 staticpro (&require_nesting_list
);
5088 Fset (Qyes_or_no_p_history
, Qnil
);
5090 DEFVAR_LISP ("features", Vfeatures
,
5091 doc
: /* A list of symbols which are the features of the executing Emacs.
5092 Used by `featurep' and `require', and altered by `provide'. */);
5093 Vfeatures
= list1 (Qemacs
);
5094 DEFSYM (Qsubfeatures
, "subfeatures");
5095 DEFSYM (Qfuncall
, "funcall");
5097 #ifdef HAVE_LANGINFO_CODESET
5098 DEFSYM (Qcodeset
, "codeset");
5099 DEFSYM (Qdays
, "days");
5100 DEFSYM (Qmonths
, "months");
5101 DEFSYM (Qpaper
, "paper");
5102 #endif /* HAVE_LANGINFO_CODESET */
5104 DEFVAR_BOOL ("use-dialog-box", use_dialog_box
,
5105 doc
: /* Non-nil means mouse commands use dialog boxes to ask questions.
5106 This applies to `y-or-n-p' and `yes-or-no-p' questions asked by commands
5107 invoked by mouse clicks and mouse menu items.
5109 On some platforms, file selection dialogs are also enabled if this is
5113 DEFVAR_BOOL ("use-file-dialog", use_file_dialog
,
5114 doc
: /* Non-nil means mouse commands use a file dialog to ask for files.
5115 This applies to commands from menus and tool bar buttons even when
5116 they are initiated from the keyboard. If `use-dialog-box' is nil,
5117 that disables the use of a file dialog, regardless of the value of
5119 use_file_dialog
= 1;
5121 defsubr (&Sidentity
);
5124 defsubr (&Ssafe_length
);
5125 defsubr (&Sstring_bytes
);
5126 defsubr (&Sstring_equal
);
5127 defsubr (&Scompare_strings
);
5128 defsubr (&Sstring_lessp
);
5129 defsubr (&Sstring_collate_lessp
);
5130 defsubr (&Sstring_collate_equalp
);
5133 defsubr (&Svconcat
);
5134 defsubr (&Scopy_sequence
);
5135 defsubr (&Sstring_make_multibyte
);
5136 defsubr (&Sstring_make_unibyte
);
5137 defsubr (&Sstring_as_multibyte
);
5138 defsubr (&Sstring_as_unibyte
);
5139 defsubr (&Sstring_to_multibyte
);
5140 defsubr (&Sstring_to_unibyte
);
5141 defsubr (&Scopy_alist
);
5142 defsubr (&Ssubstring
);
5143 defsubr (&Ssubstring_no_properties
);
5156 defsubr (&Snreverse
);
5157 defsubr (&Sreverse
);
5159 defsubr (&Splist_get
);
5161 defsubr (&Splist_put
);
5163 defsubr (&Slax_plist_get
);
5164 defsubr (&Slax_plist_put
);
5167 defsubr (&Sequal_including_properties
);
5168 defsubr (&Sfillarray
);
5169 defsubr (&Sclear_string
);
5173 defsubr (&Smapconcat
);
5174 defsubr (&Syes_or_no_p
);
5175 defsubr (&Sload_average
);
5176 defsubr (&Sfeaturep
);
5177 defsubr (&Srequire
);
5178 defsubr (&Sprovide
);
5179 defsubr (&Splist_member
);
5180 defsubr (&Swidget_put
);
5181 defsubr (&Swidget_get
);
5182 defsubr (&Swidget_apply
);
5183 defsubr (&Sbase64_encode_region
);
5184 defsubr (&Sbase64_decode_region
);
5185 defsubr (&Sbase64_encode_string
);
5186 defsubr (&Sbase64_decode_string
);
5188 defsubr (&Ssecure_hash
);
5189 defsubr (&Slocale_info
);
5191 hashtest_eq
.name
= Qeq
;
5192 hashtest_eq
.user_hash_function
= Qnil
;
5193 hashtest_eq
.user_cmp_function
= Qnil
;
5194 hashtest_eq
.cmpfn
= 0;
5195 hashtest_eq
.hashfn
= hashfn_eq
;
5197 hashtest_eql
.name
= Qeql
;
5198 hashtest_eql
.user_hash_function
= Qnil
;
5199 hashtest_eql
.user_cmp_function
= Qnil
;
5200 hashtest_eql
.cmpfn
= cmpfn_eql
;
5201 hashtest_eql
.hashfn
= hashfn_eql
;
5203 hashtest_equal
.name
= Qequal
;
5204 hashtest_equal
.user_hash_function
= Qnil
;
5205 hashtest_equal
.user_cmp_function
= Qnil
;
5206 hashtest_equal
.cmpfn
= cmpfn_equal
;
5207 hashtest_equal
.hashfn
= hashfn_equal
;