qp.el (quoted-printable-decode-region): Decode multiple bytes at once.
authorKenichi Handa <handa@m17n.org>
Thu, 30 Aug 2012 12:16:38 +0000 (21:16 +0900)
committerKenichi Handa <handa@m17n.org>
Thu, 30 Aug 2012 12:16:38 +0000 (21:16 +0900)
1  2 
lisp/gnus/ChangeLog
lisp/gnus/qp.el

@@@ -1,3 -1,3 +1,8 @@@
++2012-08-30  Kenichi Handa  <handa@gnu.org>
++
++      * qp.el (quoted-printable-decode-region): Decode multiple bytes at
++      once.
++
  2012-08-29  Julien Danjou  <julien@danjou.info>
  
        * gnus-notifications.el: New file.
diff --cc lisp/gnus/qp.el
@@@ -53,7 -53,7 +53,10 @@@ them into characters should be done sep
        ;; or both of which are lowercase letters in "abcdef", is
        ;; formally illegal. A robust implementation might choose to
        ;; recognize them as the corresponding uppercase letters.''
--      (let ((case-fold-search t))
++      (let ((case-fold-search t)
++          (decode-hex #'(lambda (n1 n2)
++                          (+ (* (if (<= n1 ?9) (- n1 ?0) (+ (- n1 ?A) 10)) 16)
++                             (if (<= n2 ?9) (- n2 ?0) (+ (- n2 ?A) 10))))))
        (narrow-to-region from to)
        ;; Do this in case we're called from Gnus, say, in a buffer
        ;; which already contains non-ASCII characters which would
                    (not (eobp)))
          (cond ((eq (char-after (1+ (point))) ?\n)
                 (delete-char 2))
--              ((looking-at "=[0-9A-F][0-9A-F]")
--               (let ((byte (string-to-number (buffer-substring (1+ (point))
--                                                            (+ 3 (point)))
--                                          16)))
--                 (mm-insert-byte byte 1)
--                 (delete-char 3)))
++              ((looking-at "\\(=[0-9A-F][0-9A-F]\\)+")
++               ;; Decode this sequence at once; i.e. by a single
++               ;; deletion and insertion.
++               (let* ((n (/ (- (match-end 0) (point)) 3))
++                      (str (make-string n 0)))
++                 (dotimes (i n)
++                   (aset str i (funcall decode-hex (char-after (1+ (point)))
++                                        (char-after (+ 2 (point)))))
++                   (forward-char 3))
++                 (delete-region (match-beginning 0) (match-end 0))
++                 (insert str)))
                (t
                 (message "Malformed quoted-printable text")
                 (forward-char)))))