(std11-parse-ascii-token): Use function
[elisp/mu-cite.git] / std11.el
index 1364272..5c06146 100644 (file)
--- a/std11.el
+++ b/std11.el
@@ -4,9 +4,9 @@
 
 ;; Author:   MORIOKA Tomohiko <morioka@jaist.ac.jp>
 ;; Keywords: mail, news, RFC 822, STD 11
-;; Version: $Id: std11.el,v 0.24 1996-08-30 06:11:58 morioka Exp $
+;; Version: $Id: std11.el,v 0.33 1996-09-14 08:42:39 morioka Exp $
 
-;; This file is part of tl (Tiny Library).
+;; This file is part of MU (Message Utilities).
 
 ;; This program is free software; you can redistribute it and/or
 ;; modify it under the terms of the GNU General Public License as
@@ -62,6 +62,26 @@ If BOUNDARY is not nil, it is used as message header separator.
            (buffer-substring-no-properties (match-end 0) (std11-field-end))
          )))))
 
+(defun std11-find-field-body (field-names &optional boundary)
+  "Return the first found field-body specified by FIELD-NAMES
+of the message header in current buffer. If BOUNDARY is not nil, it is
+used as message header separator. [std11.el]"
+  (save-excursion
+    (save-restriction
+      (std11-narrow-to-header boundary)
+      (let ((case-fold-search t)
+           field-name)
+       (catch 'tag
+         (while (setq field-name (car field-names))
+           (goto-char (point-min))
+           (if (re-search-forward (concat "^" field-name ":[ \t]*") nil t)
+               (throw 'tag
+                      (buffer-substring-no-properties
+                       (match-end 0) (std11-field-end)))
+             )
+           (setq field-names (cdr field-names))
+           ))))))
+
 (defun std11-field-bodies (field-names &optional default-value boundary)
   "Return list of each field-bodies of FIELD-NAMES of the message header
 in current buffer. If BOUNDARY is not nil, it is used as message
@@ -174,6 +194,53 @@ If BOUNDARY is not nil, it is used as message header separator.
        dest))))
 
 
+;;; @ quoted-string
+;;;
+
+(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 "")
+         "\""))
+
+(defun std11-strip-quoted-pair (str)
+  (let ((dest "")
+       (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)
+       )
+      (setq i (+ i 1))
+      )
+    dest))
+
+(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 string 1 max)
+       string)
+     )))
+
+
 ;;; @ composer
 ;;;
 
@@ -247,6 +314,18 @@ represents addr-spec of RFC 822. [std11.el]"
   (std11-parse-addresses (std11-lexical-analyze string))
   )
 
+(defun std11-extract-address-components (string)
+  "Extract full name and canonical address from STRING.
+Returns a list of the form (FULL-NAME CANONICAL-ADDRESS).
+If no name can be extracted, FULL-NAME will be nil. [std11.el]"
+  (let* ((structure (car (std11-parse-address-string
+                         (std11-unfold-string string))))
+         (phrase  (std11-full-name-string structure))
+         (address (std11-address-string structure))
+         )
+    (list phrase address)
+    ))
+
 (provide 'std11)
 
 (mapcar (function