[Gauche-devel-jp] rfc822-parse-date

Back to archive index

OGURISU Osamu oguri****@lagen*****
2003年 3月 3日 (月) 12:34:49 JST


小栗栖です。

rfc822-parse-dateについて幾つか気になりました。

(1) 曜日情報が全くない場合(rfc2822に適合)、全ての項目が#fになり
    ます。infoともずれています。

(2) sec: rfc2822には

    time-of-day     =       hour ":" minute [ ":" second ]
 
    とあるので、秒はなくてもかまわないはず。

(3) year->numberは、99や02などの2,3桁の文字列を受けいれるようで
    すが、正規表現が4桁決め打ちになっている。

(4) TZ: 英大文字の場合、3桁決め打ちになっていて"UT"を認識できない。

(5) timezoneの「旧式」フォーマット: 古いメールにはTZがなかったり、
    "+900"、"jst"のようなzone が入っていたりします。このようなメー
    ルを処理すると全ての項目が#fになってしまいますが、rfc2822に
    よれば、

     Other multi-character (usually between 3 and 5) alphabetic
     time zones have been used in Internet messages.  Any such
     time zone whose meaning is not known SHOULD be considered
     equivalent to "-0000" unless there is out-of-band
     information confirming their meaning.

  とあるので、上述のような場合は#fを返すのが適当と思います。

(5)に関してはどう判断すべきかいろいろありそうですが、次のように
rfc/822.scm を改変してみました。(3)は2桁以上をすべてacceptさせて
しまってよいのかもちょっと気になります。。。

----------------------------------------------------------------
--- 822.scm.orig	2003-01-09 20:32:57.000000000 +0900
+++ 822.scm	2003-03-03 12:30:03.000000000 +0900
@@ -157,16 +157,16 @@
           (else #f)))
 
   (rxmatch-case string
-    (#/((Sun|Mon|Tue|Wed|Thu|Fri|Sat)\s*,)?\s*(\d+)\s*(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s*(\d\d\d\d)\s+(\d\d)\s*:\s*(\d\d)\s*:\s*(\d\d)\s+([+-]\d\d\d\d|[A-Z][A-Z][A-Z])/
-       (#f #f dow dom mon yr hour min sec tz)
+    (#/((Sun|Mon|Tue|Wed|Thu|Fri|Sat)\s*,)?\s*(\d+)\s*(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s*(\d\d+)\s+(\d\d)\s*:\s*(\d\d)\s*(:\s*(\d\d))?\s+([+-]\d\d\d\d|[A-Z][A-Z][A-Z]?)?/
+       (#f #f dow dom mon yr hour min #f sec tz)
        (values (year->number yr)
                (mon->number mon)
                (string->number dom)
                (string->number hour)
                (string->number min)
-               (string->number sec)
-               (tz->number tz)
-               (dow->number dow)))
+	        (and sec (string->number sec))
+               (and tz (tz->number tz))
+               (and dow (dow->number dow))))
      (else (values #f #f #f #f #f #f #f #f))))
 
 ;(define (rfc822-date->time string)

----------------------------------------------------------------
-- 
小栗栖 修 / OGURISU Osamu



Gauche-devel-jp メーリングリストの案内
Back to archive index