1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-02-06 23:51:24 -08:00

Don't require mm-util.

(quoted-printable-decode-region): Rewritten.
(quoted-printable-decode-string, quoted-printable-encode-region):
Doc fix.
(quoted-printable-encode-region): Barf on multibyte characters.
Maybe make the class multibyte.  Upcase chars, not formatted
strings.  Allow mm-use-ultra-safe-encoding to be unbound.
(quoted-printable-encode-string): Don't use
mm-with-unibyte-buffer.
This commit is contained in:
Dave Love 2000-10-03 16:13:36 +00:00
parent 72fc04186a
commit 657b2c659b
2 changed files with 109 additions and 77 deletions

View file

@ -1,3 +1,27 @@
2000-10-03 Dave Love <fx@gnu.org>
* mail-source.el (mail-sources): Revert to nil.
* qp.el: Don't require mm-util.
(quoted-printable-decode-region): Rewritten.
(quoted-printable-decode-string, quoted-printable-encode-region):
Doc fix.
(quoted-printable-encode-region): Barf on multibyte characters.
Maybe make the class multibyte. Upcase chars, not formatted
strings. Allow mm-use-ultra-safe-encoding to be unbound.
(quoted-printable-encode-string): Don't use
mm-with-unibyte-buffer.
2000-10-03 ShengHuo ZHU <zsh@cs.rochester.edu>
* mail-source.el (mail-source-report-new-mail): Use
nnheader-cancel-timer.
2000-10-03 Simon Josefsson <simon@josefsson.org>
* mail-source.el (mail-source-imap-file-coding-system): New variable.
(mail-source-fetch-imap): Use it.
2000-09-29 Gerd Moellmann <gerd@gnu.org>
* gnus.el (gnus-mode-line-buffer-identification)[EMACS]: Fix
@ -14,6 +38,11 @@
image's :ascent to 80. That gives a mode-line which is approx.
as tall as the normal one.
2000-09-21 Dave Love <fx@gnu.org>
* smiley-ems.el (smiley-region): Test if display-graphic-p bound
(for Emacs 20). Tidy somewhat.
2000-09-21 Dave Love <fx@gnu.org>
* gnus-ems.el (gnus-article-display-xface): Use unibyte for the

View file

@ -1,7 +1,10 @@
;;; qp.el --- Quoted-Printable functions
;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: mail, extensions
;; This file is part of GNU Emacs.
;; GNU Emacs is free software; you can redistribute it and/or modify
@ -21,61 +24,51 @@
;;; Commentary:
;; Functions for encoding and decoding quoted-printable text as
;; defined in RFC 2045.
;;; Code:
(require 'mm-util)
(defvar quoted-printable-encoding-characters
(mapcar 'identity "0123456789ABCDEFabcdef"))
(defun quoted-printable-decode-region (from to &optional charset)
"Decode quoted-printable in the region between FROM and TO.
If CHARSET is non-nil, decode the region with charset."
"Decode quoted-printable in the region between FROM and TO, per RFC 2045.
If CHARSET is non-nil, decode bytes into characters with that charset."
(interactive "r")
(save-excursion
(save-restriction
(let (start)
(let ((nonascii-insert-offset nonascii-insert-offset)
;; RFC 2045: An "=" followed by two hexadecimal digits,
;; one 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.
(case-fold-search t))
(if charset
(setq nonascii-insert-offset (- (make-char charset) 128)))
(narrow-to-region from to)
(goto-char from)
(while (not (eobp))
(cond
((eq (char-after) ?=)
(delete-char 1)
(unless start
(setq start (point)))
(cond
;; End of the line.
((eq (char-after) ?\n)
(delete-char 1))
;; Encoded character.
((and
(memq (char-after) quoted-printable-encoding-characters)
(memq (char-after (1+ (point)))
quoted-printable-encoding-characters))
(insert
(string-to-number
(buffer-substring (point) (+ 2 (point)))
16))
(delete-char 2))
;; Quoted equal sign.
((eq (char-after) ?=)
(forward-char 1))
;; End of buffer.
((eobp))
;; Invalid.
(t
(message "Malformed MIME quoted-printable message"))))
((and charset start (not (eq (mm-charset-after) 'ascii)))
(mm-decode-coding-region start (point) charset)
(setq start nil)
(forward-char 1))
(t
(forward-char 1))))
(if (and charset start)
(mm-decode-coding-region start (point) charset))))))
(while (and (skip-chars-forward "^=" to)
(not (eobp)))
(cond ((eq (char-after (1+ (point))) ?\n)
(delete-char 2))
((looking-at "=[0-9A-F][0-9A-F]")
(let ((byte (string-to-int (buffer-substring (1+ (point))
(+ 3 (point)))
16)))
(if (and charset (fboundp 'unibyte-char-to-multibyte))
(insert (unibyte-char-to-multibyte byte))
(insert byte))
(delete-region (point) (+ 3 (point)))
(unless (eq byte ?=)
(backward-char))))
((eq (char-after (1+ (point))) ?=)
(forward-char)
(delete-char 1))
(t
(message "Malformed MIME quoted-printable message")
(forward-char))))))))
(defun quoted-printable-decode-string (string &optional charset)
"Decode the quoted-printable-encoded STRING and return the results.
"Decode the quoted-printable encoded STRING and return the result.
If CHARSET is non-nil, decode the region with charset."
(with-temp-buffer
(insert string)
@ -83,26 +76,33 @@ If CHARSET is non-nil, decode the region with charset."
(buffer-string)))
(defun quoted-printable-encode-region (from to &optional fold class)
"QP-encode the region between FROM and TO.
"Quoted-printable encode the region between FROM and TO per RFC 2045.
If FOLD fold long lines. If CLASS, translate the characters
matched by that regexp.
If FOLD, fold long lines at 76 characters (as required by the RFC).
If CLASS is non-nil, translate the characters matched by that class in
the form expected by `skip-chars-forward'.
If `mm-use-ultra-safe-encoding' is set, fold unconditionally and
If `mm-use-ultra-safe-encoding' is set, fold lines unconditionally and
encode lines starting with \"From\"."
(interactive "r")
(if (delq 'eight-bit-graphic
(delq 'eight-bit-control
(delq 'ascii (mm-find-charset-region from to))))
(error "Multibyte character in QP encoding region"))
(unless class
(setq class "^\000-\007\013\015-\037\200-\377="))
(if (fboundp 'string-as-multibyte)
(setq class (string-as-multibyte class)))
(save-excursion
(save-restriction
(narrow-to-region from to)
;; (mm-encode-body)
;; Encode all the non-ascii and control characters.
(goto-char (point-min))
(while (and (skip-chars-forward
(or class "^\000-\007\013\015-\037\200-\377="))
(while (and (skip-chars-forward class)
(not (eobp)))
(insert
(prog1
(upcase (format "=%02x" (char-after)))
(format "=%02x" (upcase (char-after)))
(delete-char 1))))
;; Encode white space at the end of lines.
(goto-char (point-min))
@ -111,36 +111,39 @@ encode lines starting with \"From\"."
(while (not (eolp))
(insert
(prog1
(upcase (format "=%02x" (char-after)))
(format "=%02x" (upcase (char-after)))
(delete-char 1)))))
(when (or fold mm-use-ultra-safe-encoding)
;; Fold long lines.
(let ((tab-width 1)) ;; HTAB is one character.
(goto-char (point-min))
(while (not (eobp))
;; In ultra-safe mode, encode "From " at the beginning of a
;; line.
(when mm-use-ultra-safe-encoding
(beginning-of-line)
(when (looking-at "From ")
(replace-match "From=20" nil t)))
(end-of-line)
(while (> (current-column) 76) ;; tab-width must be 1.
(beginning-of-line)
(forward-char 75);; 75 chars plus an "="
(search-backward "=" (- (point) 2) t)
(insert "=\n")
(end-of-line))
(unless (eobp)
(forward-line))))))))
(let ((mm-use-ultra-safe-encoding
(and (boundp 'mm-use-ultra-safe-encoding)
mm-use-ultra-safe-encoding)))
(when (or fold mm-use-ultra-safe-encoding)
;; Fold long lines.
(let ((tab-width 1)) ; HTAB is one character.
(goto-char (point-min))
(while (not (eobp))
;; In ultra-safe mode, encode "From " at the beginning
;; of a line.
(when mm-use-ultra-safe-encoding
(beginning-of-line)
(when (looking-at "From ")
(replace-match "From=20" nil t)))
(end-of-line)
(while (> (current-column) 76) ; tab-width must be 1.
(beginning-of-line)
(forward-char 75) ; 75 chars plus an "="
(search-backward "=" (- (point) 2) t)
(insert "=\n")
(end-of-line))
(unless (eobp)
(forward-line)))))))))
(defun quoted-printable-encode-string (string)
"QP-encode STRING and return the results."
(mm-with-unibyte-buffer
"Encode the STRING as quoted-printable and return the result."
(with-temp-buffer
(insert string)
(quoted-printable-encode-region (point-min) (point-max))
(buffer-string)))
(provide 'qp)
;; qp.el ends here
;;; qp.el ends here