Fix seq-subseq and cl-subseq for bad bounding indices
Fixes: debbugs:19434 debbugs:19519 * lisp/emacs-lisp/cl-extra.el (cl-subseq): Use seq-subseq and fix multiple evaluation. * lisp/emacs-lisp/seq.el (seq-subseq): Throw bad bounding indices error. * test/automated/seq-tests.el (test-seq-subseq): Add more tests.
This commit is contained in:
parent
909126de0f
commit
253d44bd27
5 changed files with 31 additions and 26 deletions
|
@ -197,14 +197,18 @@ If END is omitted, it defaults to the length of the sequence.
|
|||
If START or END is negative, it counts from the end."
|
||||
(cond ((or (stringp seq) (vectorp seq)) (substring seq start end))
|
||||
((listp seq)
|
||||
(let (len)
|
||||
(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))))))
|
||||
(if (> start 0) (setq seq (nthcdr start seq)))
|
||||
(when (> start 0)
|
||||
(setq seq (nthcdr (1- start) seq))
|
||||
(or seq (error "%s" errtext))
|
||||
(setq seq (cdr seq)))
|
||||
(if end
|
||||
(let ((res nil))
|
||||
(while (>= (setq end (1- end)) start)
|
||||
(while (and (>= (setq end (1- end)) start) seq)
|
||||
(push (pop seq) res))
|
||||
(or (= (1+ end) start) (error "%s" errtext))
|
||||
(nreverse res))
|
||||
(seq-copy seq))))
|
||||
(t (error "Unsupported sequence: %s" seq))))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue