From 51f5c4b773e11dd50f9fc6887362324b6d4dc755 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Sat, 23 Jul 2022 08:55:20 +0200 Subject: [PATCH] Fix off-by-one error in string-truncate-left * lisp/emacs-lisp/subr-x.el (string-truncate-left): Fix off-by-one error (bug#56685). --- lisp/emacs-lisp/subr-x.el | 8 ++++++-- test/lisp/emacs-lisp/subr-x-tests.el | 5 +++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/subr-x.el b/lisp/emacs-lisp/subr-x.el index 5037ae47e83..d5d7bfeb6f5 100644 --- a/lisp/emacs-lisp/subr-x.el +++ b/lisp/emacs-lisp/subr-x.el @@ -107,12 +107,16 @@ characters; nil stands for the empty string." ;;;###autoload (defun string-truncate-left (string length) - "Truncate STRING to LENGTH, replacing initial surplus with \"...\"." + "If STRING is longer than LENGTH, return a truncated version. +When truncating, \"...\" is always prepended to the string, so +the resulting string may be longer than the original if LENGTH is +3 or smaller." (let ((strlen (length string))) (if (<= strlen length) string (setq length (max 0 (- length 3))) - (concat "..." (substring string (max 0 (- strlen 1 length))))))) + (concat "..." (substring string (min (1- strlen) + (max 0 (- strlen length)))))))) (defsubst string-blank-p (string) "Check whether STRING is either empty or only whitespace. diff --git a/test/lisp/emacs-lisp/subr-x-tests.el b/test/lisp/emacs-lisp/subr-x-tests.el index 99c0e822155..7a3efe9db62 100644 --- a/test/lisp/emacs-lisp/subr-x-tests.el +++ b/test/lisp/emacs-lisp/subr-x-tests.el @@ -766,5 +766,10 @@ (should (equal (sort (hash-table-keys h) #'string<) '(a b c))) (should (equal (sort (hash-table-values h) #'<) '(1 2 3))))) +(ert-deftest test-string-truncate-left () + (should (equal (string-truncate-left "band" 3) "...d")) + (should (equal (string-truncate-left "band" 2) "...d")) + (should (equal (string-truncate-left "longstring" 8) "...tring"))) + (provide 'subr-x-tests) ;;; subr-x-tests.el ends here -- 2.39.2