changeset 98333:aedea0a2dba4

(term-emulate-terminal): Encode input string before checking its length.
author Chong Yidong <cyd@stupidchicken.com>
date Thu, 25 Sep 2008 00:05:52 +0000
parents 980421e378fa
children 2bdc0be61215
files lisp/term.el
diffstat 1 files changed, 23 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/term.el	Thu Sep 25 00:05:40 2008 +0000
+++ b/lisp/term.el	Thu Sep 25 00:05:52 2008 +0000
@@ -2718,7 +2718,11 @@
 
 (defun term-emulate-terminal (proc str)
   (with-current-buffer (process-buffer proc)
-    (let* ((i 0) char funny count save-point save-marker old-point temp win
+    (let* ((i 0) char funny
+	   count       ; number of decoded chars in substring
+	   count-bytes ; number of bytes
+	   decoded-substring
+	   save-point save-marker old-point temp win
 	   (buffer-undo-list t)
 	   (selected (selected-window))
 	   last-win
@@ -2777,6 +2781,10 @@
 				       str i))
 		   (when (not funny) (setq funny str-length))
 		   (cond ((> funny i)
+			  (setq decoded-substring
+				(decode-coding-string
+				 (substring str i funny)
+				 locale-coding-system))
 			  (cond ((eq term-terminal-state 1)
 				 ;; We are in state 1, we need to wrap
 				 ;; around.  Go to the beginning of
@@ -2785,21 +2793,31 @@
 				 (term-down 1 t)
 				 (term-move-columns (- (term-current-column)))
 				 (setq term-terminal-state 0)))
-			  (setq count (- funny i))
+			  (setq count (length decoded-substring))
 			  (setq temp (- (+ (term-horizontal-column) count)
 					term-width))
 			  (cond ((<= temp 0)) ;; All count chars fit in line.
 				((> count temp)	;; Some chars fit.
 				 ;; This iteration, handle only what fits.
 				 (setq count (- count temp))
+				 (setq count-bytes
+				       (length
+					(encode-coding-string
+					 (substring decoded-substring 0 count)
+					 'binary)))
 				 (setq temp 0)
-				 (setq funny (+ count i)))
+				 (setq funny (+ count-bytes i)))
 				((or (not (or term-pager-count
 					      term-scroll-with-delete))
 				     (>  (term-handle-scroll 1) 0))
 				 (term-adjust-current-row-cache 1)
 				 (setq count (min count term-width))
-				 (setq funny (+ count i))
+				 (setq count-bytes
+				       (length
+					(encode-coding-string
+					 (substring decoded-substring 0 count)
+					 'binary)))
+				 (setq funny (+ count-bytes i))
 				 (setq term-start-line-column
 				       term-current-column))
 				(t ;; Doing PAGER processing.
@@ -2813,7 +2831,7 @@
 			  ;; following point if not eob nor insert-mode.
 			  (let ((old-column (current-column))
 				columns pos)
-			    (insert (decode-coding-string (substring str i funny) locale-coding-system))
+			    (insert decoded-substring)
 			    (setq term-current-column (current-column)
 				  columns (- term-current-column old-column))
 			    (when (not (or (eobp) term-insert-mode))