-;;; 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.6 1996-08-28 14:17:21 morioka Exp $
+;; Version: $Id: std11.el,v 0.20 1996-08-28 21:03:14 morioka Exp $
;; This file is part of tl (Tiny Library).
(defconst std11-next-field-head-regexp
(concat "\n" std11-field-name-regexp ":"))
-(defun std11-field-body (name &optional boundary)
- (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)
(goto-char (match-beginning 0))
(if (re-search-forward "^$" nil t)
(point)
)
-(defun std11-field-names (&optional boundary)
+(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 (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))))
+ (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-bodies (field-names &optional default-value boundary)
+(defun std11-find-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]"
(save-excursion
(save-restriction
(std11-narrow-to-header boundary)
dest))))
+;;; @ unfolding
+;;;
+
+(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)) " "))
+ (setq string (substring string (match-end 0)))
+ )
+ (concat dest string)
+ ))
+
+
;;; @ header
;;;
(defun std11-narrow-to-header (&optional boundary)
+ "Narrow to the message header.
+If BOUNDARY is not nil, it is used as message header separator.
+\[std11.el]"
(narrow-to-region
(goto-char (point-min))
(if (re-search-forward
(point-max)
)))
-(defun std11-header-string (pat &optional boundary)
+(defun std11-header-string (regexp &optional boundary)
+ "Return string of message header fields matched by REGEXP.
+If BOUNDARY is not nil, it is used as message header separator.
+\[std11.el]"
(let ((case-fold-search t))
(save-excursion
(save-restriction
(while (re-search-forward std11-field-head-regexp nil t)
(setq field
(buffer-substring (match-beginning 0) (std11-field-end)))
- (if (string-match pat field)
+ (if (string-match regexp field)
(setq header (concat header field "\n"))
))
header)
))))
-(defun std11-header-string-except (pat &optional boundary)
+(defun std11-header-string-except (regexp &optional boundary)
+ "Return string of message header fields not matched by REGEXP.
+If BOUNDARY is not nil, it is used as message header separator.
+\[std11.el]"
(let ((case-fold-search t))
(save-excursion
(save-restriction
(while (re-search-forward std11-field-head-regexp nil t)
(setq field
(buffer-substring (match-beginning 0) (std11-field-end)))
- (if (not (string-match pat field))
+ (if (not (string-match regexp field))
(setq header (concat header field "\n"))
))
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
+
+;;; @ parser
;;;
(provide 'std11)
+(mapcar (function
+ (lambda (func)
+ (autoload func "std11-parse")
+ ))
+ '(std11-lexical-analyze
+ std11-parse-address std11-parse-addresses
+ std11-parse-address-string))
+
+(defun std11-parse-address-string (string)
+ "Parse STRING as mail address. [std11.el]"
+ (std11-parse-address (std11-lexical-analyze string))
+ )
+
+(defun std11-addr-to-string (seq)
+ (mapconcat (function
+ (lambda (token)
+ (if (let ((name (car token)))
+ (or (eq name 'spaces)
+ (eq name 'comment)
+ ))
+ ""
+ (cdr token)
+ )))
+ seq "")
+ )
+
+(defun std11-address-string (address)
+ (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)
+ )
+ )))))
+
+
+;;; @ end
+;;;
+
;;; std11.el ends here