From 51186ed69c361abd73d20a96e929b127cd7f15f9 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Sun, 1 May 2022 23:05:06 +0200 Subject: [PATCH] Fix string-lines return for "" * lisp/subr.el (string-lines): Return the correct result on "" (bug#55213). --- lisp/subr.el | 48 +++++++++++++++++++++-------------------- test/lisp/subr-tests.el | 2 ++ 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/lisp/subr.el b/lisp/subr.el index d6ea3092074..aded02c4f79 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -6747,29 +6747,31 @@ is inserted before adjusting the number of empty lines." If OMIT-NULLS, empty lines will be removed from the results. If KEEP-NEWLINES, don't strip trailing newlines from the result lines." - (let ((lines nil) - (start 0)) - (while (< start (length string)) - (let ((newline (string-search "\n" string start))) - (if newline - (progn - (when (or (not omit-nulls) - (not (= start newline))) - (let ((line (substring string start - (if keep-newlines - (1+ newline) - newline)))) - (when (not (and keep-newlines omit-nulls - (equal line "\n"))) - (push line lines)))) - (setq start (1+ newline))) - ;; No newline in the remaining part. - (if (zerop start) - ;; Avoid a string copy if there are no newlines at all. - (push string lines) - (push (substring string start) lines)) - (setq start (length string))))) - (nreverse lines))) + (if (equal string "") + (list "") + (let ((lines nil) + (start 0)) + (while (< start (length string)) + (let ((newline (string-search "\n" string start))) + (if newline + (progn + (when (or (not omit-nulls) + (not (= start newline))) + (let ((line (substring string start + (if keep-newlines + (1+ newline) + newline)))) + (when (not (and keep-newlines omit-nulls + (equal line "\n"))) + (push line lines)))) + (setq start (1+ newline))) + ;; No newline in the remaining part. + (if (zerop start) + ;; Avoid a string copy if there are no newlines at all. + (push string lines) + (push (substring string start) lines)) + (setq start (length string))))) + (nreverse lines)))) (defun buffer-match-p (condition buffer-or-name &optional arg) "Return non-nil if BUFFER-OR-NAME matches CONDITION. diff --git a/test/lisp/subr-tests.el b/test/lisp/subr-tests.el index 93e4475d6bc..f4676793ff2 100644 --- a/test/lisp/subr-tests.el +++ b/test/lisp/subr-tests.el @@ -1029,6 +1029,8 @@ final or penultimate step during initialization.")) (should-not (readablep (list (make-marker))))) (ert-deftest test-string-lines () + (should (equal (string-lines "") '(""))) + (should (equal (string-lines "foo") '("foo"))) (should (equal (string-lines "foo\n") '("foo"))) (should (equal (string-lines "foo\nbar") '("foo" "bar"))) -- 2.39.2