;; 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)))))