-;;; std11.el --- STD 11 parser for GNU Emacs
+;;; std11.el --- STD 11 functions for GNU Emacs
;; Copyright (C) 1995,1996 Free Software Foundation, Inc.
;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
;; Keywords: mail, news, RFC 822, STD 11
-;; Version: $Id: std11.el,v 0.10 1996-08-28 15:25:16 morioka Exp $
+;; Version: $Id: std11.el,v 0.25 1996-08-30 15:32:30 morioka Exp $
;; This file is part of tl (Tiny Library).
(defconst std11-next-field-head-regexp
(concat "\n" std11-field-name-regexp ":"))
-(defun std11-find-field-body (name &optional boundary)
- "Return body of field NAME.
-If BOUNDARY is not nil, it is used as message header separator.
-\[std11.el]"
- (save-excursion
- (save-restriction
- (std11-narrow-to-header boundary)
- (goto-char (point-min))
- (let ((case-fold-search t))
- (if (re-search-forward (concat "^" name ":[ \t]*") nil t)
- (buffer-substring-no-properties (match-end 0) (std11-field-end))
- )))))
-
(defun std11-field-end ()
"Move to end of field and return this point. [std11.el]"
(if (re-search-forward std11-next-field-head-regexp nil t)
(point)
)
-(defun std11-field-names (&optional boundary)
- "Return list of all field-names of the message header in current buffer.
+(defun std11-field-body (name &optional boundary)
+ "Return body of field NAME.
If BOUNDARY is not nil, it is used as message header separator.
\[std11.el]"
(save-excursion
(save-restriction
(std11-narrow-to-header boundary)
(goto-char (point-min))
- (let (dest name)
- (while (re-search-forward std11-field-head-regexp nil t)
- (setq name (buffer-substring-no-properties
- (match-beginning 0)(1- (match-end 0))))
- (or (member name dest)
- (setq dest (cons name dest))
+ (let ((case-fold-search t))
+ (if (re-search-forward (concat "^" name ":[ \t]*") nil t)
+ (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)))
)
- )
- dest))))
+ (setq field-names (cdr field-names))
+ ))))))
-(defun std11-find-field-bodies (field-names &optional default-value boundary)
+(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
header separator. [std11.el]"
header)
))))
+(defun std11-collect-field-names (&optional boundary)
+ "Return list of all 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)
+ (goto-char (point-min))
+ (let (dest name)
+ (while (re-search-forward std11-field-head-regexp nil t)
+ (setq name (buffer-substring-no-properties
+ (match-beginning 0)(1- (match-end 0))))
+ (or (member name dest)
+ (setq dest (cons name dest))
+ )
+ )
+ dest))))
-;;; @ end
+
+;;; @ composer
;;;
+(defun std11-addr-to-string (seq)
+ "Return string from lexical analyzed list SEQ
+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)
+ )))
+ seq "")
+ )
+
+(defun std11-address-string (address)
+ "Return string of address part from parsed ADDRESS of RFC 822.
+\[std11.el]"
+ (cond ((eq (car address) 'group)
+ (mapconcat (function std11-address-string)
+ (car (cdr address))
+ ", ")
+ )
+ ((eq (car address) 'mailbox)
+ (let ((addr (nth 1 address)))
+ (std11-addr-to-string
+ (if (eq (car addr) 'phrase-route-addr)
+ (nth 2 addr)
+ (cdr addr)
+ )
+ )))))
+
+(defun std11-full-name-string (address)
+ "Return string of full-name part from parsed ADDRESS of RFC 822.
+\[std11.el]"
+ (cond ((eq (car address) 'group)
+ (mapconcat (function
+ (lambda (token)
+ (cdr token)
+ ))
+ (nth 1 address) "")
+ )
+ ((eq (car address) 'mailbox)
+ (let ((addr (nth 1 address))
+ (comment (nth 2 address))
+ phrase)
+ (if (eq (car addr) 'phrase-route-addr)
+ (setq phrase (mapconcat (function
+ (lambda (token)
+ (cdr token)
+ ))
+ (nth 1 addr) ""))
+ )
+ (or phrase comment)
+ ))))
+
+
+;;; @ parser
+;;;
+
+(defun std11-parse-address-string (string)
+ "Parse STRING as mail address. [std11.el]"
+ (std11-parse-address (std11-lexical-analyze string))
+ )
+
+(defun std11-parse-addresses-string (string)
+ "Parse STRING as mail address list. [std11.el]"
+ (std11-parse-addresses (std11-lexical-analyze string))
+ )
+
(provide 'std11)
+(mapcar (function
+ (lambda (func)
+ (autoload func "std11-parse")
+ ))
+ '(std11-lexical-analyze
+ std11-parse-address std11-parse-addresses
+ std11-parse-address-string))
+
+
+;;; @ end
+;;;
+
;;; std11.el ends here