1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-03 02:31:03 -08:00

(Fsubstring): Handle vectors as well as strings.

This commit is contained in:
Richard M. Stallman 1996-08-29 03:50:02 +00:00
parent ecc0677980
commit 21fbc8e5ae

View file

@ -509,31 +509,49 @@ Elements of ALIST that are not conses are also shared.")
DEFUN ("substring", Fsubstring, Ssubstring, 2, 3, 0,
"Return a substring of STRING, starting at index FROM and ending before TO.\n\
TO may be nil or omitted; then the substring runs to the end of STRING.\n\
If FROM or TO is negative, it counts from the end.")
If FROM or TO is negative, it counts from the end.\n\
\n\
This function allows vectors as well as strings.")
(string, from, to)
Lisp_Object string;
register Lisp_Object from, to;
{
Lisp_Object res;
int size;
if (! (STRINGP (string) || VECTORP (string)))
wrong_type_argument (Qarrayp, string);
CHECK_STRING (string, 0);
CHECK_NUMBER (from, 1);
if (STRINGP (string))
size = XSTRING (string)->size;
else
size = XVECTOR (string)->size;
if (NILP (to))
to = Flength (string);
to = size;
else
CHECK_NUMBER (to, 2);
if (XINT (from) < 0)
XSETINT (from, XINT (from) + XSTRING (string)->size);
XSETINT (from, XINT (from) + size);
if (XINT (to) < 0)
XSETINT (to, XINT (to) + XSTRING (string)->size);
XSETINT (to, XINT (to) + size);
if (!(0 <= XINT (from) && XINT (from) <= XINT (to)
&& XINT (to) <= XSTRING (string)->size))
&& XINT (to) <= size))
args_out_of_range_3 (string, from, to);
res = make_string (XSTRING (string)->data + XINT (from),
XINT (to) - XINT (from));
copy_text_properties (from, to, string, make_number (0), res, Qnil);
if (STRINGP (string))
{
res = make_string (XSTRING (string)->data + XINT (from),
XINT (to) - XINT (from));
copy_text_properties (from, to, string, make_number (0), res, Qnil);
}
else
res = Fvector (XINT (to) - XINT (from),
XVECTOR (string)->contents + XINT (from));
return res;
}