-;;;
;;; mel-b.el: Base64 encoder/decoder for GNU Emacs
-;;;
-;;; Copyright (C) 1995 Free Software Foundation, Inc.
-;;; Copyright (C) 1995,1996 MORIOKA Tomohiko
-;;;
-;;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;;; Created: 1995/6/24
-;;; Version:
-;;; $Id: mel-b.el,v 3.2 1996/01/09 18:25:22 morioka Exp $
-;;; Keywords: MIME, Base64
-;;;
-;;; This file is part of MEL (MIME Encoding Library).
-;;;
-;;; This program is free software; you can redistribute it and/or
-;;; modify it under the terms of the GNU General Public License as
-;;; published by the Free Software Foundation; either version 2, or
-;;; (at your option) any later version.
-;;;
-;;; This program is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with This program. If not, write to the Free Software
-;;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-;;;
+
+;; Copyright (C) 1992,1995,1996,1997 Free Software Foundation, Inc.
+
+;; Author: ENAMI Tsugutomo <enami@sys.ptg.sony.co.jp>
+;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; Created: 1995/6/24
+;; Version: $Id: mel-b.el,v 6.3 1997/04/30 17:17:42 morioka Exp $
+;; Keywords: MIME, Base64
+
+;; This file is part of MEL (MIME Encoding Library).
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2, or (at
+;; your option) any later version.
+
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
;;; Code:
+(require 'emu)
+
;;; @ variables
;;;
;;; @@ encode/decode one base64 unit
;;;
-(defun base64-mask (i n) (logand i (1- (ash 1 n))))
-
-(defun base64-encode-1 (a &optional b &optional c)
- (cons (ash a -2)
- (cons (logior (ash (base64-mask a 2) (- 6 2))
- (if b (ash b -4) 0))
- (if b
- (cons (logior (ash (base64-mask b 4) (- 6 4))
- (if c (ash c -6) 0))
- (if c
- (cons (base64-mask c (- 6 0))
- nil)))))))
-
-(defun base64-decode-1 (a b &optional c &optional d)
- (cons (logior (ash a 2) (ash b (- 2 6)))
- (if c (cons (logior (ash (base64-mask b 4) 4)
- (base64-mask (ash c (- 4 6)) 4))
- (if d (cons (logior (ash (base64-mask c 2) 6) d)
- nil))))))
-
-(defun base64-encode-chars (a &optional b &optional c)
- (mapcar (function base64-num-to-char) (base64-encode-1 a b c)))
-
-(defun base64-decode-chars (&rest args)
- (apply (function base64-decode-1)
- (mapcar (function base64-char-to-num) args)
- ))
-
-
-;;; @@ encode/decode base64 string
+(defun base64-encode-1 (pack)
+ (let ((a (car pack))
+ (b (nth 1 pack))
+ (c (nth 2 pack)))
+ (concat
+ (char-to-string (base64-num-to-char (ash a -2)))
+ (if b
+ (concat
+ (char-to-string
+ (base64-num-to-char (logior (ash (logand a 3) 4) (ash b -4))))
+ (if c
+ (concat
+ (char-to-string
+ (base64-num-to-char (logior (ash (logand b 15) 2) (ash c -6))))
+ (char-to-string (base64-num-to-char (logand c 63)))
+ )
+ (concat (char-to-string
+ (base64-num-to-char (ash (logand b 15) 2))) "=")
+ ))
+ (concat (char-to-string
+ (base64-num-to-char (ash (logand a 3) 4))) "==")
+ ))))
+
+(defun base64-decode-1 (pack)
+ (let ((a (base64-char-to-num (car pack)))
+ (b (base64-char-to-num (nth 1 pack)))
+ (c (nth 2 pack))
+ (d (nth 3 pack)))
+ (concat (char-to-string (logior (ash a 2) (ash b -4)))
+ (if (and c (setq c (base64-char-to-num c)))
+ (concat (char-to-string
+ (logior (ash (logand b 15) 4) (ash c -2)))
+ (if (and d (setq d (base64-char-to-num d)))
+ (char-to-string (logior (ash (logand c 3) 6) d))
+ ))))))
+
+
+;;; @@ base64 encoder/decoder for string
;;;
(defun base64-encode-string (string)
+ "Encode STRING to base64, and return the result."
(let ((len (length string))
(b 0)(e 57)
dest)
(setq dest
(concat dest
(mapconcat
- (function
- (lambda (pack)
- (mapconcat (function char-to-string)
- (apply (function base64-encode-chars) pack)
- "")
- ))
+ (function base64-encode-1)
(pack-sequence (substring string b e) 3)
"")
"\n"))
)
)
(let* ((es (mapconcat
- (function
- (lambda (pack)
- (mapconcat (function char-to-string)
- (apply (function base64-encode-chars) pack)
- "")
- ))
+ (function base64-encode-1)
(pack-sequence (substring string b) 3)
""))
(m (mod (length es) 4))
)))
(defun base64-decode-string (string)
- (mapconcat (function
- (lambda (pack)
- (mapconcat (function char-to-string)
- (apply (function base64-decode-chars) pack)
- "")
- ))
+ "Decode STRING which is encoded in base64, and return the result."
+ (mapconcat (function base64-decode-1)
(pack-sequence string 4)
""))
-;;; @ encode/decode base64 region
+;;; @ base64 encoder/decoder for region
;;;
(defun base64-internal-encode-region (beg end)
(save-restriction
(narrow-to-region beg end)
(goto-char (point-min))
- (while (search-forward "\n" nil t)
- (replace-match "")
- )
- (let ((str (buffer-substring (point-min)(point-max))))
- (delete-region (point-min)(point-max))
- (insert (base64-decode-string str))
- ))))
-
-(cond ((boundp 'MULE)
- (define-program-coding-system
- nil (car base64-external-encoder) *noconv*)
- (define-program-coding-system
- nil (car base64-external-decoder) *noconv*)
- )
- ((boundp 'NEMACS)
- (define-program-kanji-code
- nil (car base64-external-encoder) 0)
- (define-program-kanji-code
- nil (car base64-external-decoder) 0)
- ))
+ (while (looking-at ".*\n")
+ (condition-case err
+ (replace-match
+ (base64-decode-string
+ (buffer-substring (match-beginning 0) (1- (match-end 0))))
+ t t)
+ (error
+ (prog1
+ (message (nth 1 err))
+ (replace-match "")))))
+ (if (looking-at ".*$")
+ (condition-case err
+ (replace-match
+ (base64-decode-string
+ (buffer-substring (match-beginning 0) (match-end 0)))
+ t t)
+ (error
+ (prog1
+ (message (nth 1 err))
+ (replace-match "")))
+ ))
+ )))
(defun base64-external-encode-region (beg end)
(save-excursion
(save-restriction
(narrow-to-region beg end)
- (let ((selective-display nil) ;Disable ^M to nl translation.
- (mc-flag nil) ;Mule
- (kanji-flag nil)) ;NEmacs
- (apply (function call-process-region)
- beg end (car base64-external-encoder)
- t t nil (cdr base64-external-encoder))
- )
+ (as-binary-process (apply (function call-process-region)
+ beg end (car base64-external-encoder)
+ t t nil (cdr base64-external-encoder))
+ )
;; for OS/2
;; regularize line break code
(goto-char (point-min))
(defun base64-external-decode-region (beg end)
(save-excursion
- (let ((selective-display nil) ;Disable ^M to nl translation.
- (mc-flag nil) ;Mule
- (kanji-flag nil)) ;NEmacs
- (apply (function call-process-region)
- beg end (car base64-external-decoder)
- t t nil (cdr base64-external-decoder))
- )))
-
-(defun base64-encode-region (beg end)
+ (as-binary-process (apply (function call-process-region)
+ beg end (car base64-external-decoder)
+ t t nil (cdr base64-external-decoder))
+ )))
+
+(defun base64-encode-region (start end)
+ "Encode current region by base64.
+START and END are buffer positions.
+This function calls internal base64 encoder if size of region is
+smaller than `base64-internal-encoding-limit', otherwise it calls
+external base64 encoder specified by `base64-external-encoder'. In
+this case, you must install the program (maybe mmencode included in
+metamail or XEmacs package)."
(interactive "r")
(if (and base64-internal-encoding-limit
- (> (- end beg) base64-internal-encoding-limit))
- (base64-external-encode-region beg end)
- (base64-internal-encode-region beg end)
+ (> (- end start) base64-internal-encoding-limit))
+ (base64-external-encode-region start end)
+ (base64-internal-encode-region start end)
))
-(defun base64-decode-region (beg end)
+(defun base64-decode-region (start end)
+ "Decode current region by base64.
+START and END are buffer positions.
+This function calls internal base64 decoder if size of region is
+smaller than `base64-internal-decoding-limit', otherwise it calls
+external base64 decoder specified by `base64-external-decoder'. In
+this case, you must install the program (maybe mmencode included in
+metamail or XEmacs package)."
(interactive "r")
(if (and base64-internal-decoding-limit
- (> (- end beg) base64-internal-decoding-limit))
- (base64-external-decode-region beg end)
- (base64-internal-decode-region beg end)
+ (> (- end start) base64-internal-decoding-limit))
+ (base64-external-decode-region start end)
+ (base64-internal-decode-region start end)
))
+;;; @ base64 encoder/decoder for file
+;;;
+
+(defun base64-insert-encoded-file (filename)
+ "Encode contents of file FILENAME to base64, and insert the result.
+It calls external base64 encoder specified by
+`base64-external-encoder'. So you must install the program (maybe
+mmencode included in metamail or XEmacs package)."
+ (interactive (list (read-file-name "Insert encoded file: ")))
+ (apply (function call-process) (car base64-external-encoder)
+ filename t nil (cdr base64-external-encoder))
+ )
+
+
;;; @ etc
;;;
;;;
(provide 'mel-b)
+
+;;; mel-b.el ends here.
-;;;
;;; mel-g.el: Gzip64 encoder/decoder for GNU Emacs
-;;;
-;;; Copyright (C) 1995,1996 MORIOKA Tomohiko
-;;; Copyright (C) 1996 Shuhei KOBAYASHI
-;;;
-;;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;;; Shuhei KOBAYASHI <shuhei@cmpt01.phys.tohoku.ac.jp>
-;;; Created: 1995/10/25
-;;; Version:
-;;; $Id: mel-g.el,v 1.1 1996/03/11 17:01:45 shuhei Exp $
-;;; Keywords: MIME, base64, gzip
-;;;
-;;; This file is not part of MEL (MIME Encoding Library) yet.
-;;;
-;;; This program is free software; you can redistribute it and/or
-;;; modify it under the terms of the GNU General Public License as
-;;; published by the Free Software Foundation; either version 2, or
-;;; (at your option) any later version.
-;;;
-;;; This program is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with This program. If not, write to the Free Software
-;;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-;;;
+
+;; Copyright (C) 1995,1996,1997 MORIOKA Tomohiko
+;; Copyright (C) 1996 Shuhei KOBAYASHI
+
+;; Author: Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+;; modified by MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; Maintainer: Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+;; Created: 1995/10/25
+;; Version: $Id: mel-g.el,v 6.1 1997/03/10 13:06:34 morioka Exp $
+;; Keywords: Gzip64, base64, gzip, MIME
+
+;; This file is not part of MEL (MIME Encoding Library) yet.
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2, or (at
+;; your option) any later version.
+
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
;;; Code:
+(require 'emu)
+(require 'file-detect)
+
+
;;; @ variables
;;;
-(defvar gzip64-external-encoder '("sh" "-c" "gzip -c | mmencode")
+(defvar gzip64-external-encoder
+ (let ((file (exec-installed-p "mmencode")))
+ (and file
+ (` ("sh" "-c" (, (concat "gzip -c | " file))))
+ ))
"*list of gzip64 encoder program name and its arguments.")
-(defvar gzip64-external-decoder '("sh" "-c" "mmencode -u | gzip -dc")
+(defvar gzip64-external-decoder
+ (let ((file (exec-installed-p "mmencode")))
+ (and file
+ (` ("sh" "-c" (, (concat file " -u | gzip -dc"))))
+ ))
"*list of gzip64 decoder program name and its arguments.")
-;;; @ external encoder
+;;; @ encoder/decoder for region
;;;
-(cond ((boundp 'MULE)
- (define-program-coding-system
- nil (car gzip64-external-encoder) *noconv*)
- (define-program-coding-system
- nil (car gzip64-external-decoder) *noconv*)
- )
- ((boundp 'NEMACS)
- (define-program-kanji-code
- nil (car gzip64-external-encoder) 0)
- (define-program-kanji-code
- nil (car gzip64-external-decoder) 0)
- ))
-
(defun gzip64-external-encode-region (beg end)
(interactive "*r")
(save-excursion
- (let (selective-display ; Disable ^M to nl translation.
- mc-flag ; for Mule
- kanji-flag) ; for NEmacs
- (apply (function call-process-region)
- beg end (car gzip64-external-encoder)
- t t nil (cdr gzip64-external-encoder))
- )))
+ (as-binary-process (apply (function call-process-region)
+ beg end (car gzip64-external-encoder)
+ t t nil (cdr gzip64-external-encoder))
+ )
+ ;; for OS/2
+ ;; regularize line break code
+ (goto-char (point-min))
+ (while (re-search-forward "\r$" nil t)
+ (replace-match "")
+ )
+ ))
(defun gzip64-external-decode-region (beg end)
(interactive "*r")
(save-excursion
- (let ((selective-display nil) ; Disable ^M to nl translation.
- (mc-flag nil) ; for Mule
- (kanji-flag nil)) ; for NEmacs
- (apply (function call-process-region)
- beg end (car gzip64-external-decoder)
- t t nil (cdr gzip64-external-decoder))
- )))
+ (as-binary-process (apply (function call-process-region)
+ beg end (car gzip64-external-decoder)
+ t t nil (cdr gzip64-external-decoder))
+ )
+ ))
(defalias 'gzip64-encode-region 'gzip64-external-encode-region)
(defalias 'gzip64-decode-region 'gzip64-external-decode-region)
+;;; @ encoder/decoder for file
+;;;
+
+(defun gzip64-insert-encoded-file (filename)
+ (interactive (list (read-file-name "Insert encoded file: ")))
+ (apply (function call-process) (car gzip64-external-encoder)
+ filename t nil
+ (cdr gzip64-external-encoder))
+ )
+
+
;;; @ end
;;;
-;;;
-;;; mel-q.el: Quoted-Printable encoder/decoder for GNU Emacs
-;;;
-;;; Copyright (C) 1995 Free Software Foundation, Inc.
-;;; Copyright (C) 1995,1996 MORIOKA Tomohiko
-;;;
-;;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;;; Created: 1995/6/25
-;;; Version:
-;;; $Id: mel-q.el,v 3.2 1996/03/11 14:29:31 morioka Exp $
-;;; Keywords: MIME, Quoted-Printable
-;;;
-;;; This file is part of MEL (MIME Encoding Library).
-;;;
-;;; This program is free software; you can redistribute it and/or
-;;; modify it under the terms of the GNU General Public License as
-;;; published by the Free Software Foundation; either version 2, or
-;;; (at your option) any later version.
-;;;
-;;; This program is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with This program. If not, write to the Free Software
-;;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-;;;
+;;; mel-q.el: Quoted-Printable and Q-encoding encoder/decoder for GNU Emacs
+
+;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc.
+
+;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; Created: 1995/6/25
+;; Version: $Id: mel-q.el,v 6.5 1997/04/30 17:23:04 morioka Exp $
+;; Keywords: MIME, Quoted-Printable, Q-encoding
+
+;; This file is part of MEL (MIME Encoding Library).
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2, or (at
+;; your option) any later version.
+
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
;;; Code:
+(require 'emu)
+
+
;;; @ constants
;;;
))
-;;; @@ Quoted-Printable encode/decode string
+;;; @@ Quoted-Printable encoder/decoder for string
;;;
-(defun quoted-printable-encode-string (str)
+(defun quoted-printable-encode-string (string)
+ "Encode STRING to quoted-printable, and return the result."
(let ((i 0))
(mapconcat (function
(lambda (chr)
(char-to-string chr)
)))
)))
- str "")))
+ string "")))
-(defun quoted-printable-decode-string (str)
+(defun quoted-printable-decode-string (string)
+ "Decode STRING which is encoded in quoted-printable, and return the result."
(let (q h l)
(mapconcat (function
(lambda (chr)
)
(t (char-to-string chr))
)))
- str "")))
+ string "")))
-;;; @@ Quoted-Printable encode/decode region
+;;; @@ Quoted-Printable encoder/decoder for region
;;;
(defun quoted-printable-internal-encode-region (beg end)
))
)))
-(cond ((boundp 'MULE)
- (define-program-coding-system
- nil (car quoted-printable-external-encoder) *noconv*)
- (define-program-coding-system
- nil (car quoted-printable-external-decoder) *noconv*)
- )
- ((boundp 'NEMACS)
- (define-program-kanji-code
- nil (car quoted-printable-external-encoder) 0)
- (define-program-kanji-code
- nil (car quoted-printable-external-decoder) 0)
- ))
-
(defun quoted-printable-external-encode-region (beg end)
(save-excursion
(save-restriction
(narrow-to-region beg end)
- (let ((selective-display nil) ;Disable ^M to nl translation.
- (mc-flag nil) ;Mule
- (kanji-flag nil)) ;NEmacs
- (apply (function call-process-region)
- beg end (car quoted-printable-external-encoder)
- t t nil (cdr quoted-printable-external-encoder))
- )
+ (as-binary-process
+ (apply (function call-process-region)
+ beg end (car quoted-printable-external-encoder)
+ t t nil (cdr quoted-printable-external-encoder))
+ )
;; for OS/2
;; regularize line break code
(goto-char (point-min))
(defun quoted-printable-external-decode-region (beg end)
(save-excursion
- (let ((selective-display nil) ;Disable ^M to nl translation.
- (mc-flag nil) ;Mule
- (kanji-flag nil)) ;NEmacs
- (apply (function call-process-region)
- beg end (car quoted-printable-external-decoder)
- t t nil (cdr quoted-printable-external-decoder))
- )))
+ (as-binary-process
+ (apply (function call-process-region)
+ beg end (car quoted-printable-external-decoder)
+ t t nil (cdr quoted-printable-external-decoder))
+ )))
(defun quoted-printable-encode-region (beg end)
+ "Encode current region by quoted-printable.
+START and END are buffer positions.
+This function calls internal quoted-printable encoder if size of
+region is smaller than `quoted-printable-internal-encoding-limit',
+otherwise it calls external quoted-printable encoder specified by
+`quoted-printable-external-encoder'. In this case, you must install
+the program (maybe mmencode included in metamail or XEmacs package)."
(interactive "r")
(if (and quoted-printable-internal-encoding-limit
(> (- end beg) quoted-printable-internal-encoding-limit))
))
(defun quoted-printable-decode-region (beg end)
+ "Decode current region by quoted-printable.
+START and END are buffer positions.
+This function calls internal quoted-printable decoder if size of
+region is smaller than `quoted-printable-internal-decoding-limit',
+otherwise it calls external quoted-printable decoder specified by
+`quoted-printable-external-decoder'. In this case, you must install
+the program (maybe mmencode included in metamail or XEmacs package)."
(interactive "r")
(if (and quoted-printable-internal-decoding-limit
(> (- end beg) quoted-printable-internal-decoding-limit))
))
+;;; @@ Quoted-Printable encoder/decoder for file
+;;;
+
+(defun quoted-printable-insert-encoded-file (filename)
+ "Encode contents of file FILENAME to quoted-printable, and insert the result.
+It calls external quoted-printable encoder specified by
+`quoted-printable-external-encoder'. So you must install the program
+(maybe mmencode included in metamail or XEmacs package)."
+ (interactive (list (read-file-name "Insert encoded file: ")))
+ (apply (function call-process) (car quoted-printable-external-encoder)
+ filename t nil (cdr quoted-printable-external-encoder))
+ )
+
+\f
;;; @ Q-encoding encode/decode string
;;;
-(defun q-encoding-encode-string-for-text (str)
- (mapconcat (function
- (lambda (chr)
- (cond ((eq chr 32) "_")
- ((or (< chr 32) (< 126 chr) (eq chr ?=))
- (quoted-printable-quote-char chr)
- )
- (t (char-to-string chr))
- )))
- str ""))
-
-(defun q-encoding-encode-string-for-comment (str)
- (mapconcat (function
- (lambda (chr)
- (cond ((eq chr 32) "_")
- ((or (< chr 32) (< 126 chr)
- (memq chr '(?= ?\( ?\) ?\\))
- )
- (quoted-printable-quote-char chr)
- )
- (t (char-to-string chr))
- )))
- str ""))
-
-(defun q-encoding-encode-string-for-phrase (str)
- (mapconcat (function
- (lambda (chr)
- (cond ((eq chr 32) "_")
- ((or (and (<= ?A chr)(<= chr ?Z))
- (and (<= ?a chr)(<= chr ?z))
- (and (<= ?0 chr)(<= chr ?9))
- (memq chr '(?! ?* ?+ ?- ?/))
- )
- (char-to-string chr)
- )
- (t (quoted-printable-quote-char chr))
- )))
- str ""))
-
-(defun q-encoding-encode-string (str &optional mode)
- (cond ((eq mode 'text)
- (q-encoding-encode-string-for-text str)
- )
- ((eq mode 'comment)
- (q-encoding-encode-string-for-comment str)
- )
- (t
- (q-encoding-encode-string-for-phrase str)
- )))
-
-(defun q-encoding-decode-string (str)
+(defconst q-encoding-special-chars-alist
+ '((text ?= ?? ?_)
+ (comment ?= ?? ?_ ?\( ?\) ?\\)
+ (phrase ?= ?? ?_ ?\( ?\) ?\\ ?\" ?# ?$ ?% ?& ?' ?, ?. ?/
+ ?: ?\; ?< ?> ?@ ?\[ ?\] ?^ ?` ?{ ?| ?} ?~)
+ ))
+
+(defun q-encoding-encode-string (string &optional mode)
+ "Encode STRING to Q-encoding of encoded-word, and return the result.
+MODE allows `text', `comment', `phrase' or nil. Default value is
+`phrase'."
+ (let ((specials (cdr (or (assq mode q-encoding-special-chars-alist)
+ (assq 'phrase q-encoding-special-chars-alist)
+ ))))
+ (mapconcat (function
+ (lambda (chr)
+ (cond ((eq chr 32) "_")
+ ((or (< chr 32) (< 126 chr)
+ (memq chr specials)
+ )
+ (quoted-printable-quote-char chr)
+ )
+ (t
+ (char-to-string chr)
+ ))
+ ))
+ string "")
+ ))
+
+(defun q-encoding-decode-string (string)
+ "Decode STRING which is encoded in Q-encoding and return the result."
(let (q h l)
(mapconcat (function
(lambda (chr)
)
(t (char-to-string chr))
)))
- str "")))
+ string "")))
;;; @@ etc
;;;
+(defun q-encoding-printable-char-p (chr mode)
+ (and (not (memq chr '(?= ?? ?_)))
+ (<= ?\ chr)(<= chr ?~)
+ (cond ((eq mode 'text) t)
+ ((eq mode 'comment)
+ (not (memq chr '(?\( ?\) ?\\)))
+ )
+ (t
+ (string-match "[A-Za-z0-9!*+/=_---]" (char-to-string chr))
+ ))))
+
(defun q-encoding-encoded-length (string &optional mode)
(let ((l 0)(i 0)(len (length string)) chr)
(while (< i len)
(setq chr (elt string i))
- (if (string-match "[A-Za-z0-9!*+/=_---]" (char-to-string chr))
+ (if (q-encoding-printable-char-p chr mode)
(setq l (+ l 1))
(setq l (+ l 3))
)
-;;;
;;; mel-u.el: uuencode encoder/decoder for GNU Emacs
-;;;
-;;; Copyright (C) 1995 Free Software Foundation, Inc.
-;;; Copyright (C) 1995,1996 MORIOKA Tomohiko
-;;;
-;;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;;; Created: 1995/10/25
-;;; Version:
-;;; $Id: mel-u.el,v 3.2 1996/01/09 18:19:25 morioka Exp $
-;;; Keywords: uuencode
-;;;
-;;; This file is part of MEL (MIME Encoding Library).
-;;;
-;;; This program is free software; you can redistribute it and/or
-;;; modify it under the terms of the GNU General Public License as
-;;; published by the Free Software Foundation; either version 2, or
-;;; (at your option) any later version.
-;;;
-;;; This program is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with This program. If not, write to the Free Software
-;;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-;;;
+
+;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc.
+
+;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; Created: 1995/10/25
+;; Version: $Id: mel-u.el,v 5.7 1997/03/10 15:15:09 morioka Exp $
+;; Keywords: uuencode
+
+;; This file is part of MEL (MIME Encoding Library).
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2, or (at
+;; your option) any later version.
+
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
;;; Code:
+(require 'emu)
+(require 'mel)
+
+
;;; @ variables
;;;
-(defvar mime/tmp-dir (or (getenv "TM_TMP_DIR") "/tmp/"))
-
(defvar uuencode-external-encoder '("uuencode" "-")
"*list of uuencode encoder program name and its arguments.")
(defvar uuencode-external-decoder
- (list "sh" "-c" (format "(cd %s; uudecode)" mime/tmp-dir))
+ (list "sh" "-c" (format "(cd %s; uudecode)" mime-temp-directory))
"*list of uuencode decoder program name and its arguments.")
-;;; @ external encoder
+;;; @ uuencode encoder/decoder for region
;;;
-(cond ((boundp 'MULE)
- (define-program-coding-system
- nil (car uuencode-external-encoder) *noconv*)
- (define-program-coding-system
- nil (car uuencode-external-decoder) *noconv*)
- )
- ((boundp 'NEMACS)
- (define-program-kanji-code
- nil (car uuencode-external-encoder) 0)
- (define-program-kanji-code
- nil (car uuencode-external-decoder) 0)
- ))
-
-(defun uuencode-external-encode-region (beg end)
+(defun uuencode-external-encode-region (start end)
+ "Encode current region by unofficial uuencode format.
+This function uses external uuencode encoder which is specified by
+variable `uuencode-external-encoder'."
(interactive "*r")
(save-excursion
- (let (selective-display ; Disable ^M to nl translation.
- mc-flag ; for Mule
- kanji-flag) ; for NEmacs
- (apply (function call-process-region)
- beg end (car uuencode-external-encoder)
- t t nil (cdr uuencode-external-encoder))
- )))
+ (as-binary-process (apply (function call-process-region)
+ start end (car uuencode-external-encoder)
+ t t nil (cdr uuencode-external-encoder))
+ )
+ ;; for OS/2
+ ;; regularize line break code
+ (goto-char (point-min))
+ (while (re-search-forward "\r$" nil t)
+ (replace-match "")
+ )
+ ))
-(defun uuencode-external-decode-region (beg end)
+(defun uuencode-external-decode-region (start end)
+ "Decode current region by unofficial uuencode format.
+This function uses external uuencode decoder which is specified by
+variable `uuencode-external-decoder'."
(interactive "*r")
(save-excursion
- (let (selective-display ; Disable ^M to nl translation.
- mc-flag ; for Mule
- kanji-flag ; for NEmacs
- (filename (save-excursion
+ (let ((filename (save-excursion
(save-restriction
- (narrow-to-region beg end)
- (goto-char beg)
+ (narrow-to-region start end)
+ (goto-char start)
(if (re-search-forward "^begin [0-9]+ " nil t)
(if (looking-at ".+$")
(buffer-substring (match-beginning 0)
- (match-end 0)
- )
- )))))
- )
+ (match-end 0))
+ ))))))
(if filename
- (progn
- (apply (function call-process-region)
- beg end (car uuencode-external-decoder)
- t nil nil (cdr uuencode-external-decoder))
- (setq filename (expand-file-name filename mime/tmp-dir))
- (let ((file-coding-system-for-read
- (if (boundp 'MULE) *noconv*)) ; for Mule
- kanji-fileio-code ; for NEmacs
- (emx-binary-mode t) ; for OS/2
- jka-compr-compression-info-list ; for jka-compr
- jam-zcat-filename-list ; for jam-zcat
- require-final-newline)
- (insert-file-contents filename)
- )
- (delete-file filename)
- ))
+ (as-binary-process
+ (apply (function call-process-region)
+ start end (car uuencode-external-decoder)
+ t nil nil (cdr uuencode-external-decoder))
+ (setq filename (expand-file-name filename mime-temp-directory))
+ (as-binary-input-file (insert-file-contents filename))
+ (delete-file filename)
+ ))
)))
(defalias 'uuencode-encode-region 'uuencode-external-encode-region)
(defalias 'uuencode-decode-region 'uuencode-external-decode-region)
+;;; @ uuencode encoder/decoder for file
+;;;
+
+(defun uuencode-insert-encoded-file (filename)
+ "Insert file encoded by unofficial uuencode format.
+This function uses external uuencode encoder which is specified by
+variable `uuencode-external-encoder'."
+ (interactive (list (read-file-name "Insert encoded file: ")))
+ (call-process (car uuencode-external-encoder) filename t nil
+ (file-name-nondirectory filename))
+ )
+
+
;;; @ end
;;;
(provide 'mel-u)
+
+;;; mel-u.el ends here
-;;;
;;; mel.el : a MIME encoding/decoding library
-;;;
-;;; Copyright (C) 1995 Free Software Foundation, Inc.
-;;; Copyright (C) 1995,1996 MORIOKA Tomohiko
-;;;
-;;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;;; modified by Shuhei KOBAYASHI <shuhei@cmpt01.phys.tohoku.ac.jp>
-;;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;;; Created: 1995/6/25
-;;; Version:
-;;; $Id: mel.el,v 3.5 1996/03/13 16:05:41 morioka Exp $
-;;; Keywords: MIME, Base64, Quoted-Printable, uuencode, gzip64
-;;;
-;;; This file is part of MEL (MIME Encoding Library).
-;;;
-;;; This program is free software; you can redistribute it and/or
-;;; modify it under the terms of the GNU General Public License as
-;;; published by the Free Software Foundation; either version 2, or
-;;; (at your option) any later version.
-;;;
-;;; This program is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with This program. If not, write to the Free Software
-;;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-;;;
+
+;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc.
+
+;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; modified by Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+;; Created: 1995/6/25
+;; Version: $Id: mel.el,v 6.9 1997/04/30 17:24:32 morioka Exp $
+;; Keywords: MIME, Base64, Quoted-Printable, uuencode, gzip64
+
+;; This file is part of MEL (MIME Encoding Library).
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2, or (at
+;; your option) any later version.
+
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
;;; Code:
-(autoload 'base64-encode-region "mel-b" nil t)
-(autoload 'base64-decode-region "mel-b" nil t)
-(autoload 'base64-encode-string "mel-b")
-(autoload 'base64-decode-string "mel-b")
-(autoload 'base64-encoded-length "mel-b")
+;;; @ variable
+;;;
-(autoload 'quoted-printable-encode-region "mel-q" nil t)
-(autoload 'quoted-printable-decode-region "mel-q" nil t)
+(defvar mime-temp-directory (or (getenv "MIME_TMP_DIR")
+ (getenv "TM_TMP_DIR")
+ "/tmp/")
+ "*Directory for temporary files.")
-(autoload 'q-encoding-encode-string-for-text "mel-q")
-(autoload 'q-encoding-encode-string-for-comment "mel-q")
-(autoload 'q-encoding-encode-string-for-phrase "mel-q")
-(autoload 'q-encoding-encode-string "mel-q")
-(autoload 'q-encoding-decode-string "mel-q")
-(autoload 'q-encoding-encoded-length "mel-q")
-(autoload 'uuencode-encode-region "mel-u" nil t)
-(autoload 'uuencode-decode-region "mel-u" nil t)
+;;; @ region
+;;;
-(autoload 'gzip64-encode-region "mel-g" nil t)
-(autoload 'gzip64-decode-region "mel-g" nil t)
+(autoload 'base64-encode-region
+ "mel-b" "Encode current region by base64." t)
+(autoload 'quoted-printable-encode-region
+ "mel-q" "Encode current region by Quoted-Printable." t)
+(autoload 'uuencode-encode-region
+ "mel-u" "Encode current region by unofficial uuencode format." t)
+(autoload 'gzip64-encode-region
+ "mel-g" "Encode current region by unofficial x-gzip64 format." t)
(defvar mime-encoding-method-alist
'(("base64" . base64-encode-region)
("7bit")
("8bit")
("binary")
- ))
+ )
+ "Alist of encoding vs. corresponding method to encode region.
+Each element looks like (STRING . FUNCTION) or (STRING . nil).
+STRING is content-transfer-encoding.
+FUNCTION is region encoder and nil means not to encode.")
+
+
+(autoload 'base64-decode-region
+ "mel-b" "Decode current region by base64." t)
+(autoload 'quoted-printable-decode-region
+ "mel-q" "Decode current region by Quoted-Printable." t)
+(autoload 'uuencode-decode-region
+ "mel-u" "Decode current region by unofficial uuencode format." t)
+(autoload 'gzip64-decode-region
+ "mel-g" "Decode current region by unofficial x-gzip64 format." t)
(defvar mime-decoding-method-alist
'(("base64" . base64-decode-region)
("quoted-printable" . quoted-printable-decode-region)
("x-uue" . uuencode-decode-region)
+ ("x-uuencode" . uuencode-decode-region)
("x-gzip64" . gzip64-decode-region)
- ))
+ )
+ "Alist of encoding vs. corresponding method to decode region.
+Each element looks like (STRING . FUNCTION).
+STRING is content-transfer-encoding.
+FUNCTION is region decoder.")
-;;; @ region
-;;;
-
-(defun mime/encode-region (encoding beg end)
- "Encode region BEG to END of current buffer using ENCODING. [mel.el]"
+(defun mime-encode-region (start end encoding)
+ "Encode region START to END of current buffer using ENCODING."
(interactive
- (list (completing-read "encoding: "
+ (list (region-beginning) (region-end)
+ (completing-read "encoding: "
mime-encoding-method-alist
- nil t "base64")
- (region-beginning) (region-end))
+ nil t "base64"))
)
(let ((f (cdr (assoc encoding mime-encoding-method-alist))))
(if f
- (funcall f beg end)
+ (funcall f start end)
)))
-(defun mime/decode-region (encoding beg end)
- "Decode region BEG to END of current buffer using ENCODING. [mel.el]"
+(defun mime-decode-region (start end encoding)
+ "Decode region START to END of current buffer using ENCODING."
(interactive
- (list (completing-read "encoding: "
+ (list (region-beginning) (region-end)
+ (completing-read "encoding: "
mime-decoding-method-alist
- nil t "base64")
- (region-beginning) (region-end))
+ nil t "base64"))
)
(let ((f (cdr (assoc encoding mime-decoding-method-alist))))
(if f
- (funcall f beg end)
+ (funcall f start end)
)))
-(defalias 'mime-encode-region 'mime/encode-region)
-(defalias 'mime-decode-region 'mime/decode-region)
+
+;;; @ file
+;;;
+
+(autoload 'base64-insert-encoded-file "mel-b"
+ "Encode contents of file to base64, and insert the result." t)
+(autoload 'quoted-printable-insert-encoded-file "mel-q"
+ "Encode contents of file to quoted-printable, and insert the result." t)
+(autoload 'uuencode-insert-encoded-file
+ "mel-u" "Insert file encoded by unofficial uuencode format." t)
+(autoload 'gzip64-insert-encoded-file
+ "mel-g" "Insert file encoded by unofficial gzip64 format." t)
+
+(defvar mime-file-encoding-method-alist
+ '(("base64" . base64-insert-encoded-file)
+ ("quoted-printable" . quoted-printable-insert-encoded-file)
+ ("x-uue" . uuencode-insert-encoded-file)
+ ("x-gzip64" . gzip64-insert-encoded-file)
+ ("7bit" . insert-binary-file-contents-literally)
+ ("8bit" . insert-binary-file-contents-literally)
+ ("binary" . insert-binary-file-contents-literally)
+ )
+ "Alist of encoding vs. corresponding method to insert encoded file.
+Each element looks like (STRING . FUNCTION).
+STRING is content-transfer-encoding.
+FUNCTION is function to insert encoded file.")
+
+(defun mime-insert-encoded-file (filename encoding)
+ "Insert file FILENAME encoded by ENCODING format."
+ (interactive
+ (list (read-file-name "Insert encoded file: ")
+ (completing-read "encoding: "
+ mime-encoding-method-alist
+ nil t "base64"))
+ )
+ (let ((f (cdr (assoc encoding mime-file-encoding-method-alist))))
+ (if f
+ (funcall f filename)
+ )))
+
+
+;;; @ string
+;;;
+
+(autoload 'base64-encode-string "mel-b"
+ "Encode STRING to base64, and return the result.")
+(autoload 'base64-decode-string "mel-b"
+ "Decode STRING which is encoded in base64, and return the result.")
+(autoload 'quoted-printable-encode-string "mel-q"
+ "Encode STRING to quoted-printable, and return the result.")
+(autoload 'quoted-printable-decode-string "mel-q"
+ "Decode STRING which is encoded in quoted-printable, and return the result.")
+
+(autoload 'q-encoding-encode-string "mel-q"
+ "Encode STRING to Q-encoding of encoded-word, and return the result.")
+(autoload 'q-encoding-decode-string "mel-q"
+ "Decode STRING which is encoded in Q-encoding and return the result.")
+
+(autoload 'base64-encoded-length "mel-b")
+(autoload 'q-encoding-encoded-length "mel-q")
;;; @ end