Handle completely undecoded input in term (Bug#29918)
* lisp/term.el (term-emulate-terminal): Avoid errors if the whole decoded string is eight-bit characters. Don't attempt to save the string for next iteration in that case. * test/lisp/term-tests.el (term-decode-partial) (term-undecodable-input): New tests.
This commit is contained in:
parent
021f32cca1
commit
150bdfe43a
2 changed files with 24 additions and 4 deletions
|
@ -2900,11 +2900,12 @@ See `term-prompt-regexp'."
|
||||||
;; next time.
|
;; next time.
|
||||||
(when (= funny str-length)
|
(when (= funny str-length)
|
||||||
(let ((partial 0))
|
(let ((partial 0))
|
||||||
(while (eq (char-charset (aref decoded-substring
|
(while (and (< partial count)
|
||||||
(- count 1 partial)))
|
(eq (char-charset (aref decoded-substring
|
||||||
'eight-bit)
|
(- count 1 partial)))
|
||||||
|
'eight-bit))
|
||||||
(cl-incf partial))
|
(cl-incf partial))
|
||||||
(when (> partial 0)
|
(when (> count partial 0)
|
||||||
(setq term-terminal-undecoded-bytes
|
(setq term-terminal-undecoded-bytes
|
||||||
(substring decoded-substring (- partial)))
|
(substring decoded-substring (- partial)))
|
||||||
(setq decoded-substring
|
(setq decoded-substring
|
||||||
|
|
|
@ -144,6 +144,25 @@ This is a reduced example from GNU nano's initial screen."
|
||||||
`("\e[1;3r" "\e[2;1H" ,x "\r\e[1A" ,y))
|
`("\e[1;3r" "\e[2;1H" ,x "\r\e[1A" ,y))
|
||||||
(concat y "\n" x)))))
|
(concat y "\n" x)))))
|
||||||
|
|
||||||
|
(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))))))))
|
||||||
|
|
||||||
|
(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")
|
||||||
|
(string (decode-coding-string bytes locale-coding-system)))
|
||||||
|
(should (equal string
|
||||||
|
(term-test-screen-from-input
|
||||||
|
40 1 bytes)))))
|
||||||
|
|
||||||
(provide 'term-tests)
|
(provide 'term-tests)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue