This commit was manufactured by cvs2svn to create branch 'xemacs'.
[elisp/apel.git] / std11.el
index bc7e870..c051a16 100644 (file)
--- a/std11.el
+++ b/std11.el
@@ -1,10 +1,10 @@
 ;;; std11.el --- STD 11 functions for GNU Emacs
 
-;; Copyright (C) 1995,1996 Free Software Foundation, Inc.
+;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc.
 
 ;; Author:   MORIOKA Tomohiko <morioka@jaist.ac.jp>
 ;; Keywords: mail, news, RFC 822, STD 11
-;; Version: $Id: std11.el,v 0.32 1996-09-14 08:41:00 morioka Exp $
+;; Version: $Id: std11.el,v 0.40 1997-03-03 08:03:06 shuhei-k Exp $
 
 ;; This file is part of MU (Message Utilities).
 
@@ -19,8 +19,8 @@
 ;; General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with This program; see the file COPYING.  If not, write to
-;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; 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:
@@ -113,8 +113,11 @@ header separator. [std11.el]"
 (defun std11-unfold-string (string)
   "Unfold STRING as message header field. [std11.el]"
   (let ((dest ""))
-    (while (string-match "\n\\s +" string)
-      (setq dest (concat dest (substring string 0 (match-beginning 0)) " "))
+    (while (string-match "\n\\([ \t]\\)" string)
+      (setq dest (concat dest
+                         (substring string 0 (match-beginning 0))
+                         (match-string 1 string)
+                         ))
       (setq string (substring string (match-end 0)))
       )
     (concat dest string)
@@ -197,48 +200,59 @@ If BOUNDARY is not nil, it is used as message header separator.
 ;;; @ quoted-string
 ;;;
 
+(defun std11-wrap-as-quoted-pairs (string specials)
+  (let (dest
+       (i 0)
+       (b 0)
+       (len (length string))
+       )
+    (while (< i len)
+      (let ((chr (aref string i)))
+       (if (memq chr specials)
+           (setq dest (concat dest (substring string b i) "\\")
+                 b i)
+         ))
+      (setq i (1+ i))
+      )
+    (concat dest (substring string b))
+    ))
+
 (defconst std11-non-qtext-char-list '(?\" ?\\ ?\r ?\n))
 
 (defun std11-wrap-as-quoted-string (string)
   "Wrap STRING as RFC 822 quoted-string. [std11.el]"
   (concat "\""
-         (mapconcat (function
-                     (lambda (chr)
-                       (if (memq chr std11-non-qtext-char-list)
-                           (concat "\\" (char-to-string chr))
-                         (char-to-string chr)
-                         )
-                       )) string "")
+         (std11-wrap-as-quoted-pairs string std11-non-qtext-char-list)
          "\""))
 
-(defun std11-strip-quoted-pair (str)
-  (let ((dest "")
+(defun std11-strip-quoted-pair (string)
+  "Strip quoted-pairs in STRING. [std11.el]"
+  (let (dest
+       (b 0)
        (i 0)
-       (len (length str))
-       chr flag)
-    (while (< i len)
-      (setq chr (aref str i))
-      (if (or flag (not (eq chr ?\\)))
-         (progn
-           (setq dest (concat dest (char-to-string chr)))
-           (setq flag nil)
-           )
-       (setq flag t)
+       (len (length string))
        )
-      (setq i (+ i 1))
-      )
-    dest))
+    (while (< i len)
+      (let ((chr (aref string i)))
+       (if (eq chr ?\\)
+           (setq dest (concat dest (substring string b i))
+                 b (1+ i)
+                 i (+ i 2))
+         (setq i (1+ i))
+         )))
+    (concat dest (substring string b))
+    ))
 
 (defun std11-strip-quoted-string (string)
   "Strip quoted-string STRING. [std11.el]"
-  (std11-strip-quoted-pair
-   (let ((max (1- (length string))))
-     (if (and (eq (aref string 0) ?\")
-             (eq (aref string max) ?\")
-             )
-        (substring str 1 max)
-       string)
-     )))
+  (let ((len (length string)))
+    (or (and (>= len 2)
+            (let ((max (1- len)))
+              (and (eq (aref string 0) ?\")
+                   (eq (aref string max) ?\")
+                   (std11-strip-quoted-pair (substring string 1 max))
+                   )))
+       string)))
 
 
 ;;; @ composer
@@ -249,13 +263,14 @@ If BOUNDARY is not nil, it is used as message header separator.
 represents addr-spec of RFC 822. [std11.el]"
   (mapconcat (function
              (lambda (token)
-               (if (let ((name (car token)))
-                     (or (eq name 'spaces)
-                         (eq name 'comment)
-                         ))
-                   ""
-                 (cdr token)
-                 )))
+               (let ((name (car token)))
+                  (cond
+                   ((eq name 'spaces) "")
+                   ((eq name 'comment) "")
+                   ((eq name 'quoted-string)
+                    (concat "\"" (cdr token) "\""))
+                   (t (cdr token)))
+                  )))
             seq "")
   )
 
@@ -291,13 +306,28 @@ represents addr-spec of RFC 822. [std11.el]"
               (comment (nth 2 address))
               phrase)
           (if (eq (car addr) 'phrase-route-addr)
-              (setq phrase (mapconcat (function
-                                       (lambda (token)
-                                         (cdr token)
-                                         ))
-                                      (nth 1 addr) ""))
+              (setq phrase
+                    (mapconcat
+                     (function
+                      (lambda (token)
+                        (let ((type (car token)))
+                          (cond ((eq type 'quoted-string)
+                                 (std11-strip-quoted-pair (cdr token))
+                                 )
+                                ((eq type 'comment)
+                                 (concat
+                                  "("
+                                  (std11-strip-quoted-pair (cdr token))
+                                  ")")
+                                 )
+                                (t
+                                 (cdr token)
+                                 )))))
+                     (nth 1 addr) ""))
             )
-          (or phrase comment)
+          (cond ((> (length phrase) 0) phrase)
+                (comment (std11-strip-quoted-pair comment))
+                )
           ))))