aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2008-06-15 04:43:35 +0000
committerStefan Monnier2008-06-15 04:43:35 +0000
commit813c812568b3bca29c24b5ef23d44bd098a2bbb0 (patch)
treebf9a051db27efa49b82e5884d01f68fa6533ad8c
parent2360a8f535520beca50bc48e3734d93e7a0ae45d (diff)
downloademacs-813c812568b3bca29c24b5ef23d44bd098a2bbb0.tar.gz
emacs-813c812568b3bca29c24b5ef23d44bd098a2bbb0.zip
(encoded-kbd-self-insert-utf-8): Catch and recover from case when the bytes
we thought we were reading turn out to be something else entirely, such as latin-1 chars from quail. See bug#396.
-rw-r--r--lisp/ChangeLog7
-rw-r--r--lisp/international/encoded-kb.el23
2 files changed, 26 insertions, 4 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index fd6246c5916..42b7c94c6aa 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,10 @@
12008-06-15 Stefan Monnier <monnier@iro.umontreal.ca>
2
3 * international/encoded-kb.el (encoded-kbd-self-insert-utf-8):
4 Catch and recover from case when the bytes we thought we were reading
5 turn out to be something else entirely, such as latin-1 chars from
6 quail. See bug#396.
7
12008-06-15 Dan Nicolaescu <dann@ics.uci.edu> 82008-06-15 Dan Nicolaescu <dann@ics.uci.edu>
2 9
3 * vc.el (vc-deduce-fileset): Check if the buffer has a file. 10 * vc.el (vc-deduce-fileset): Check if the buffer has a file.
diff --git a/lisp/international/encoded-kb.el b/lisp/international/encoded-kb.el
index ec887659e9c..4659b499112 100644
--- a/lisp/international/encoded-kb.el
+++ b/lisp/international/encoded-kb.el
@@ -219,8 +219,9 @@ The following key sequence may cause multilingual text insertion."
219 219
220(defun encoded-kbd-self-insert-utf-8 (arg) 220(defun encoded-kbd-self-insert-utf-8 (arg)
221 (interactive "p") 221 (interactive "p")
222 (let ((char (encoded-kbd-last-key)) 222 (let* ((lead (encoded-kbd-last-key))
223 len) 223 (char lead)
224 len event)
224 (cond ((< char #xE0) 225 (cond ((< char #xE0)
225 (setq len 1 char (logand char #x1F))) 226 (setq len 1 char (logand char #x1F)))
226 ((< char #xF0) 227 ((< char #xF0)
@@ -230,8 +231,22 @@ The following key sequence may cause multilingual text insertion."
230 (t 231 (t
231 (setq len 4 char 0))) 232 (setq len 4 char 0)))
232 (while (> len 0) 233 (while (> len 0)
233 (setq char (logior (lsh char 6) (logand (read-char-exclusive) #x3F)) 234 (setq event (read-char-exclusive))
234 len (1- len))) 235 (if (and (>= event #x80) (< event #xc0))
236 ;; Valid utf-8 sequence.
237 (setq char (logior (lsh char 6) (- event #x80))
238 len (1- len))
239 ;; Invalid utf-8 sequence. Might be because Quail got involved
240 ;; in-between and the bytes we thought we were reading were actually
241 ;; latin-1 chars. Let's presume that `event' is the second "byte",
242 ;; i.e. there weren't any "apprently correct" between `lead' and
243 ;; `event': it's easy to recover in this case, and the more general
244 ;; case seems pretty unlikely.
245 ;; FIXME: We should really do encoded-kbd decoding before processing
246 ;; input-methods.
247 (push event unread-command-events)
248 (setq char lead)
249 (setq len 0)))
235 (vector char))) 250 (vector char)))
236 251
237(defun encoded-kbd-setup-keymap (keymap coding) 252(defun encoded-kbd-setup-keymap (keymap coding)