Fix term.el bug with very short multibyte character chunk

Before this change, a chunk containing only a part
of a multibyte character would be discarded and
displayed undecoded on the terminal.
* lisp/term.el (term-emulate-terminal): Fix handling chunks
with part of a multibyte character.  (Bug#77410)

* test/lisp/term-tests.el (term-decode-partial)
(term-undecodable-input): Fix and enhance tests.

Copyright-paperwork-exempt: yes
This commit is contained in:
Stephane Zermatten 2025-03-31 16:41:08 +03:00 committed by Eli Zaretskii
parent b0d6fe1449
commit 158cf528c4
2 changed files with 10 additions and 9 deletions

View file

@ -3116,7 +3116,7 @@ See `term-prompt-regexp'."
(- count 1 partial)))
'eight-bit))
(incf partial))
(when (> count partial 0)
(when (> partial 0)
(setq term-terminal-undecoded-bytes
(substring decoded-substring (- partial)))
(setq decoded-substring

View file

@ -402,17 +402,18 @@ This is a reduced example from GNU nano's initial screen."
(ert-deftest term-decode-partial () ;; Bug#25288.
"Test multibyte characters sent into multiple chunks."
;; Set `locale-coding-system' so test will be deterministic.
(let* ((locale-coding-system 'utf-8-unix)
(string (make-string 7 ))
(bytes (encode-coding-string string locale-coding-system)))
(should (equal string
(term-test-screen-from-input
40 1 `(,(substring bytes 0 (/ (length bytes) 2))
,(substring bytes (/ (length bytes) 2))))))))
(let ((locale-coding-system 'utf-8-unix))
(should (equal "шшш" (term-test-screen-from-input
40 1 '("\321" "\210\321\210\321\210"))))
(should (equal "шшш" (term-test-screen-from-input
40 1 '("\321\210\321" "\210\321\210"))))
(should (equal "шшш" (term-test-screen-from-input
40 1 '("\321\210\321\210\321" "\210"))))))
(ert-deftest term-undecodable-input () ;; Bug#29918.
"Undecodable bytes should be passed through without error."
(let* ((locale-coding-system 'utf-8-unix) ; As above.
(bytes "\376\340\360\370")
(bytes "\376\340\360\370.")
(string (decode-coding-string bytes locale-coding-system)))
(should (equal string
(term-test-screen-from-input