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