1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-30 04:10:54 -08:00

Merge remote-tracking branch 'origin/fix/subsequence-error-with-negative-sequences'

This commit is contained in:
Nicolas Petton 2015-08-08 21:54:45 +02:00
commit 45987b3453
3 changed files with 15 additions and 3 deletions

View file

@ -518,7 +518,9 @@ This sets the values of: `cl-most-positive-float', `cl-most-negative-float',
(defun cl-subseq (seq start &optional end)
"Return the subsequence of SEQ from START to END.
If END is omitted, it defaults to the length of the sequence.
If START or END is negative, it counts from the end."
If START or END is negative, it counts from the end.
Signal an error if START or END are outside of the sequence (i.e
too large if positive or too small if negative)"
(declare (gv-setter
(lambda (new)
(macroexp-let2 nil new new

View file

@ -221,12 +221,17 @@ TESTFN is used to compare elements, or `equal' if TESTFN is nil."
(defun seq-subseq (seq start &optional end)
"Return the subsequence of SEQ from START to END.
If END is omitted, it defaults to the length of the sequence.
If START or END is negative, it counts from the end."
If START or END is negative, it counts from the end.
Signal an error if START or END are outside of the sequence (i.e
too large if positive or too small if negative)"
(cond ((or (stringp seq) (vectorp seq)) (substring seq start end))
((listp seq)
(let (len (errtext (format "Bad bounding indices: %s, %s" start end)))
(and end (< end 0) (setq end (+ end (setq len (seq-length seq)))))
(if (< start 0) (setq start (+ start (or len (setq len (seq-length seq))))))
(unless (>= start 0)
(error "%s" errtext))
(when (> start 0)
(setq seq (nthcdr (1- start) seq))
(or seq (error "%s" errtext))

View file

@ -187,7 +187,12 @@ Evaluate BODY for each created sequence.
(should-not (seq-subseq '(1 2 3) 3))
(should (seq-subseq '(1 2 3) -3))
(should-error (seq-subseq '(1 2 3) 1 4))
(should (seq-subseq '(1 2 3) 1 3)))
(should (seq-subseq '(1 2 3) 1 3))
(should-error (seq-subseq '() -1))
(should-error (seq-subseq [] -1))
(should-error (seq-subseq "" -1))
(should-not (seq-subseq '() 0))
(should-error(seq-subseq '() 0 -1)))
(ert-deftest test-seq-concatenate ()
(with-test-sequences (seq '(2 4 6))