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)
-      (let ((col 0)
-           enable-multibyte-characters)
+      (let ((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))
                 )
-               ((looking-at "[ \t]\n")
+               ((looking-at-as-unibyte "[ \t]\n")
                 (forward-char 1)
                 (insert "=\n")
                 (forward-char 1)
 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
@@ -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)
-    (quoted-printable-encode-region (point-min)(point-max))
+    (quoted-printable-internal-encode-region (point-min)(point-max))
     (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
@@ -159,53 +165,37 @@ It calls external quoted-printable encoder specified by
 ;;; @ 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))
-      (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.")
@@ -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.")
 
-(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
@@ -239,11 +229,24 @@ the program (maybe mmencode included in metamail or XEmacs package)."
     (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.")
 
-(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
@@ -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'."
@@ -291,7 +294,7 @@ MODE allows `text', `comment', `phrase' or nil.  Default value is
               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
@@ -300,16 +303,10 @@ MODE allows `text', `comment', `phrase' or nil.  Default value is
                        ((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)
                           "")
-                       (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)
@@ -334,7 +331,7 @@ MODE allows `text', `comment', `phrase' or nil.  Default value is
              (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))