Mercurial > emacs
changeset 15966:ceb8d03a04f6
(Fsubstring): Handle vectors as well as strings.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Thu, 29 Aug 1996 03:50:02 +0000 |
parents | daebc0d7f610 |
children | b791ab74ff30 |
files | src/fns.c |
diffstat | 1 files changed, 27 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/fns.c Thu Aug 29 01:54:43 1996 +0000 +++ b/src/fns.c Thu Aug 29 03:50:02 1996 +0000 @@ -509,31 +509,49 @@ 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; - CHECK_STRING (string, 0); + if (! (STRINGP (string) || VECTORP (string))) + wrong_type_argument (Qarrayp, string); + 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; }