From: Kenichi Handa Date: Thu, 30 Aug 2012 12:16:38 +0000 (+0900) Subject: qp.el (quoted-printable-decode-region): Decode multiple bytes at once. X-Git-Tag: emacs-24.2.90~471 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=8b0c72d319128b339582e1d2ed772353a6404cad;p=emacs.git qp.el (quoted-printable-decode-region): Decode multiple bytes at once. --- 8b0c72d319128b339582e1d2ed772353a6404cad diff --cc lisp/gnus/ChangeLog index 4db752f13a4,4db752f13a4..9de24402f90 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@@ -1,3 -1,3 +1,8 @@@ ++2012-08-30 Kenichi Handa ++ ++ * qp.el (quoted-printable-decode-region): Decode multiple bytes at ++ once. ++ 2012-08-29 Julien Danjou * gnus-notifications.el: New file. diff --cc lisp/gnus/qp.el index c8481aa9dee,c8481aa9dee..87252684a48 --- a/lisp/gnus/qp.el +++ b/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 @@@ -65,12 -65,12 +68,17 @@@ (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)))))