X-Git-Url: http://cgit.sxemacs.org/?p=gnus;a=blobdiff_plain;f=lisp%2Fqp.el;h=6c48f0fc9a45ace1c4d2965c873062fc191b555b;hp=aeec743ce55ecac1f83dbec0cd7a367bd472a6a4;hb=b83561e18ceb438203812786590893bd5fc2a6cc;hpb=2a7fa71aba0499808ad9fe57a1b8593b69eee397 diff --git a/lisp/qp.el b/lisp/qp.el index aeec743ce..6c48f0fc9 100644 --- a/lisp/qp.el +++ b/lisp/qp.el @@ -1,7 +1,6 @@ ;;; qp.el --- Quoted-Printable functions -;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, -;; 2007, 2008, 2009 Free Software Foundation, Inc. +;; Copyright (C) 1998-2015 Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen ;; Keywords: mail, extensions @@ -66,12 +65,24 @@ them into characters should be done separately." (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) + (let ((n1 (char-after (1+ (point)))) + (n2 (char-after (+ 2 (point))))) + (aset str i + (+ (* 16 (- n1 (if (<= n1 ?9) ?0 + (if (<= n1 ?F) (- ?A 10) + (- ?a 10))))) + (- n2 (if (<= n2 ?9) ?0 + (if (<= n2 ?F) (- ?A 10) + (- ?a 10))))))) + (forward-char 3)) + (delete-region (match-beginning 0) (match-end 0)) + (insert str))) (t (message "Malformed quoted-printable text") (forward-char))))) @@ -164,5 +175,4 @@ encode lines starting with \"From\"." (provide 'qp) -;; arch-tag: db89e52a-e4a1-4b69-926f-f434f04216ba ;;; qp.el ends here