;;; std11-parse.el --- STD 11 parser 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>
+;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
;; Keywords: mail, news, RFC 822, STD 11
-;; Version: $Id: std11-parse.el,v 0.10 1996-08-28 20:40:29 morioka Exp $
+;; Version: $Id: std11-parse.el,v 1.1 1998-02-04 07:21:11 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
;; 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:
(require 'std11)
-
-(autoload 'find-charset-string "emu")
+(require 'emu)
;;; @ lexical analyze
;;;
(defconst std11-space-chars " \t\n")
-(defconst std11-spaces-regexp (concat "^[" std11-space-chars "]+"))
-(defconst std11-special-chars "][()<>@,;:\\<>.\"")
+(defconst std11-spaces-regexp (` (, (concat "[" std11-space-chars "]+"))))
+(defconst std11-special-char-list '(?\] ?\[
+ ?\( ?\) ?< ?> ?@
+ ?, ?\; ?: ?\\ ?\"
+ ?.))
(defconst std11-atom-regexp
- (concat "^[^" std11-special-chars std11-space-chars "]+"))
+ (` (, (concat "^[^" std11-special-char-list std11-space-chars "]+"))))
-(defun std11-analyze-spaces (str)
- (if (string-match std11-spaces-regexp str)
+(defun std11-analyze-spaces (string)
+ (if (and (string-match std11-spaces-regexp string)
+ (= (match-beginning 0) 0))
(let ((end (match-end 0)))
- (cons (cons 'spaces (substring str 0 end))
- (substring str end)
+ (cons (cons 'spaces (substring string 0 end))
+ (substring string end)
))))
(defun std11-analyze-special (str)
(if (and (> (length str) 0)
- (find (aref str 0) std11-special-chars)
- )
+ (memq (aref str 0) std11-special-char-list))
(cons (cons 'specials (substring str 0 1))
(substring str 1)
)))
)
(if (and (> len i)
(eq (aref str i) open))
- (let (p chr dest)
+ (let (p chr)
(setq i (1+ i))
(catch 'tag
(while (< i len)
(let (token itl parsed token-value)
(while (and lal
(setq token (car lal))
- (if (and (setq token-value (cdr token))
- (find-charset-string token-value)
- )
- (setq token nil)
- (std11-ignored-token-p token)
- ))
+ (or (std11-ignored-token-p token)
+ (if (and (setq token-value (cdr token))
+ (find-non-ascii-charset-string token-value)
+ )
+ (setq token nil)
+ )))
(setq lal (cdr lal))
(setq itl (cons token itl))
)
(nreverse dest)
))))
-
-;;; @ utilities
-;;;
-
-(defun std11-parse-address-string (string)
- "Parse STRING as mail address. [std11-parse.el]"
- (std11-parse-address (std11-lexical-analyze string))
- )
+(defun std11-parse-msg-id (lal)
+ (let ((ret (std11-parse-ascii-token lal))
+ < addr-spec >)
+ (if (and ret
+ (setq < (car ret))
+ (string-equal (cdr (assq 'specials <)) "<")
+ (setq lal (cdr ret))
+ (setq ret (std11-parse-addr-spec lal))
+ (setq addr-spec (car ret))
+ (setq lal (cdr ret))
+ (setq ret (std11-parse-ascii-token lal))
+ (setq > (car ret))
+ (string-equal (cdr (assq 'specials >)) ">")
+ )
+ (cons (cons 'msg-id (cdr addr-spec))
+ (cdr ret))
+ )))
;;; @ end