Fix typo.
[elisp/flim.git] / mel-q.el
index 9a8f954..04d27e6 100644 (file)
--- a/mel-q.el
+++ b/mel-q.el
     (save-restriction
       (narrow-to-region start end)
       (goto-char start)
     (save-restriction
       (narrow-to-region start end)
       (goto-char start)
-      (let ((col 0)
-           enable-multibyte-characters)
+      (let ((col 0))
        (while (< (point)(point-max))
          (cond ((>= col 75)
                 (insert "=\n")
                 (setq col 0)
                 )
        (while (< (point)(point-max))
          (cond ((>= col 75)
                 (insert "=\n")
                 (setq col 0)
                 )
-               ((looking-at "^From ")
+               ((looking-at-as-unibyte "^From ")
                 (replace-match "=46rom ")
                 (backward-char 1)
                 (setq col (+ col 6))
                 )
                 (replace-match "=46rom ")
                 (backward-char 1)
                 (setq col (+ col 6))
                 )
-               ((looking-at "[ \t]\n")
+               ((looking-at-as-unibyte "[ \t]\n")
                 (forward-char 1)
                 (insert "=\n")
                 (forward-char 1)
                 (forward-char 1)
                 (insert "=\n")
                 (forward-char 1)
 If size of input to encode is larger than this limit,
 external encoder is called.")
 
 If size of input to encode is larger than this limit,
 external encoder is called.")
 
-(defun quoted-printable-encode-region (start end)
+(defun quoted-printable-int-ext-encode-region (start end)
   "Encode current region by quoted-printable.
 START and END are buffer positions.
 This function calls internal quoted-printable encoder if size of
   "Encode current region by quoted-printable.
 START and END are buffer positions.
 This function calls internal quoted-printable encoder if size of
@@ -136,16 +135,23 @@ the program (maybe mmencode included in metamail or XEmacs package)."
     ))
 
 
     ))
 
 
-(defun quoted-printable-encode-string (string)
+(defun quoted-printable-internal-encode-string (string)
   "Encode STRING to quoted-printable, and return the result."
   (with-temp-buffer
     (insert string)
   "Encode STRING to quoted-printable, and return the result."
   (with-temp-buffer
     (insert string)
-    (quoted-printable-encode-region (point-min)(point-max))
+    (quoted-printable-internal-encode-region (point-min)(point-max))
     (buffer-string)
     ))
 
     (buffer-string)
     ))
 
+(defun quoted-printable-external-encode-string (string)
+  "Encode STRING to quoted-printable, and return the result."
+  (with-temp-buffer
+    (insert string)
+    (quoted-printable-external-encode-region (point-min)(point-max))
+    (buffer-string)
+    ))
 
 
-(defun quoted-printable-insert-encoded-file (filename)
+(defun quoted-printable-external-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
   "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
@@ -159,53 +165,37 @@ It calls external quoted-printable encoder specified by
 ;;; @ Quoted-Printable decoder
 ;;;
 
 ;;; @ Quoted-Printable decoder
 ;;;
 
-(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)
-                 (cond ((eq chr ?=)
-                        (setq q t)
-                        "")
-                       (q (setq h
-                                (cond ((<= ?a chr) (+ (- chr ?a) 10))
-                                      ((<= ?A chr) (+ (- chr ?A) 10))
-                                      ((<= ?0 chr) (- chr ?0))
-                                      ))
-                          (setq q nil)
-                          "")
-                       (h (setq l (cond ((<= ?a chr) (+ (- chr ?a) 10))
-                                        ((<= ?A chr) (+ (- chr ?A) 10))
-                                        ((<= ?0 chr) (- chr ?0))
-                                        ))
-                          (prog1
-                              (char-to-string (logior (ash h 4) l))
-                            (setq h nil)
-                            )
-                          )
-                       (t (char-to-string chr))
-                       )))
-              string "")))
+(defsubst quoted-printable-hex-char-to-num (chr)
+  (cond ((<= ?a chr) (+ (- chr ?a) 10))
+       ((<= ?A chr) (+ (- chr ?A) 10))
+       ((<= ?0 chr) (- chr ?0))
+       ))
 
 (defun quoted-printable-internal-decode-region (start end)
   (save-excursion
     (save-restriction
       (narrow-to-region start end)
       (goto-char (point-min))
 
 (defun quoted-printable-internal-decode-region (start end)
   (save-excursion
     (save-restriction
       (narrow-to-region start end)
       (goto-char (point-min))
-      (while (re-search-forward "=\n" nil t)
-       (replace-match "")
-       )
-      (goto-char (point-min))
-      (let (b e str)
-       (while (re-search-forward quoted-printable-octet-regexp nil t)
-         (setq b (match-beginning 0))
-         (setq e (match-end 0))
-         (setq str (buffer-substring b e))
-         (delete-region b e)
-         (insert (quoted-printable-decode-string str))
-         ))
-      )))
-
+      (while (search-forward "=" nil t)
+       (let ((beg (match-beginning 0)))
+         (cond ((looking-at "\n")
+                (delete-region beg (match-end 0))
+                )
+               ((looking-at
+                 `,(concat "[" quoted-printable-hex-chars
+                           "][" quoted-printable-hex-chars "]"))
+                (let* ((end (match-end 0))
+                       (hex (buffer-substring (match-beginning 0) end)))
+                  (delete-region beg end)
+                  (insert
+                   (logior
+                    (ash (quoted-printable-hex-char-to-num (aref hex 0)) 4)
+                    (quoted-printable-hex-char-to-num (aref hex 1))))
+                  ))
+               (t
+                ;; invalid
+                ))
+         )))))
 
 (defvar quoted-printable-external-decoder '("mmencode" "-q" "-u")
   "*list of quoted-printable decoder program name and its arguments.")
 
 (defvar quoted-printable-external-decoder '("mmencode" "-q" "-u")
   "*list of quoted-printable decoder program name and its arguments.")
@@ -224,7 +214,7 @@ It calls external quoted-printable encoder specified by
 If size of input to decode is larger than this limit,
 external decoder is called.")
 
 If size of input to decode is larger than this limit,
 external decoder is called.")
 
-(defun quoted-printable-decode-region (start end)
+(defun quoted-printable-int-ext-decode-region (start end)
   "Decode current region by quoted-printable.
 START and END are buffer positions.
 This function calls internal quoted-printable decoder if size of
   "Decode current region by quoted-printable.
 START and END are buffer positions.
 This function calls internal quoted-printable decoder if size of
@@ -239,11 +229,24 @@ the program (maybe mmencode included in metamail or XEmacs package)."
     (quoted-printable-internal-decode-region start end)
     ))
 
     (quoted-printable-internal-decode-region start end)
     ))
 
+(defun quoted-printable-internal-decode-string (string)
+  "Decode STRING which is encoded in quoted-printable, and return the result."
+  (with-temp-buffer
+    (insert string)
+    (quoted-printable-internal-decode-region (point-min)(point-max))
+    (buffer-string)))
+
+(defun quoted-printable-external-decode-string (string)
+  "Decode STRING which is encoded in quoted-printable, and return the result."
+  (with-temp-buffer
+    (insert string)
+    (quoted-printable-external-decode-region (point-min)(point-max))
+    (buffer-string)))
 
 (defvar quoted-printable-external-decoder-option-to-specify-file '("-o")
   "*list of options of quoted-printable decoder program to specify file.")
 
 
 (defvar quoted-printable-external-decoder-option-to-specify-file '("-o")
   "*list of options of quoted-printable decoder program to specify file.")
 
-(defun quoted-printable-write-decoded-region (start end filename)
+(defun quoted-printable-external-write-decoded-region (start end filename)
   "Decode and write current region encoded by quoted-printable into FILENAME.
 START and END are buffer positions."
   (interactive
   "Decode and write current region encoded by quoted-printable into FILENAME.
 START and END are buffer positions."
   (interactive
@@ -269,7 +272,7 @@ START and END are buffer positions."
                ?: ?\; ?< ?> ?@ ?\[ ?\] ?^ ?` ?{ ?| ?} ?~)
     ))
 
                ?: ?\; ?< ?> ?@ ?\[ ?\] ?^ ?` ?{ ?| ?} ?~)
     ))
 
-(defun q-encoding-encode-string (string &optional mode)
+(defun q-encoding-internal-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'."
   "Encode STRING to Q-encoding of encoded-word, and return the result.
 MODE allows `text', `comment', `phrase' or nil.  Default value is
 `phrase'."
@@ -291,7 +294,7 @@ MODE allows `text', `comment', `phrase' or nil.  Default value is
               string "")
     ))
 
               string "")
     ))
 
-(defun q-encoding-decode-string (string)
+(defun q-encoding-internal-decode-string (string)
   "Decode STRING which is encoded in Q-encoding and return the result."
   (let (q h l)
     (mapconcat (function
   "Decode STRING which is encoded in Q-encoding and return the result."
   (let (q h l)
     (mapconcat (function
@@ -300,16 +303,10 @@ MODE allows `text', `comment', `phrase' or nil.  Default value is
                        ((eq chr ?=)
                         (setq q t)
                         "")
                        ((eq chr ?=)
                         (setq q t)
                         "")
-                       (q (setq h (cond ((<= ?a chr) (+ (- chr ?a) 10))
-                                        ((<= ?A chr) (+ (- chr ?A) 10))
-                                        ((<= ?0 chr) (- chr ?0))
-                                        ))
+                       (q (setq h (quoted-printable-hex-char-to-num chr))
                           (setq q nil)
                           "")
                           (setq q nil)
                           "")
-                       (h (setq l (cond ((<= ?a chr) (+ (- chr ?a) 10))
-                                        ((<= ?A chr) (+ (- chr ?A) 10))
-                                        ((<= ?0 chr) (- chr ?0))
-                                        ))
+                       (h (setq l (quoted-printable-hex-char-to-num chr))
                           (prog1
                               (char-to-string (logior (ash h 4) l))
                             (setq h nil)
                           (prog1
                               (char-to-string (logior (ash h 4) l))
                             (setq h nil)
@@ -334,7 +331,7 @@ MODE allows `text', `comment', `phrase' or nil.  Default value is
              (string-match "[A-Za-z0-9!*+/=_---]" (char-to-string chr))
              ))))
 
              (string-match "[A-Za-z0-9!*+/=_---]" (char-to-string chr))
              ))))
 
-(defun q-encoding-encoded-length (string &optional mode)
+(defun q-encoding-internal-encoded-length (string &optional mode)
   (let ((l 0)(i 0)(len (length string)) chr)
     (while (< i len)
       (setq chr (elt string i))
   (let ((l 0)(i 0)(len (length string)) chr)
     (while (< i len)
       (setq chr (elt string i))