summaryrefslogtreecommitdiff
path: root/sample/from.rb
diff options
context:
space:
mode:
authorYukihiro Matsumoto <matz@ruby-lang.org>1995-05-19 15:33:23 +0900
committerTakashi Kokubun <takashikkbn@gmail.com>2019-08-17 22:09:32 +0900
commit8bf1c909dc31fd4bcdc1488cda9fe89a62bc2830 (patch)
tree6899d116a280ba8f99f65e21fe9259706474c0aa /sample/from.rb
parentb2420d8ffa4d347a75efbbdc376f4ce65c0eb172 (diff)
version 0.76v0_76
https://cache.ruby-lang.org/pub/ruby/1.0/ruby-0.76.tar.gz Fri May 19 15:33:23 1995 Yukihiro Matsumoto <matz@ix-02> * version 0.76 Fri May 19 00:48:08 1995 Yukihiro Matsumoto (matz@dyna) * string.c (Fstr_each): イテレータブロック中で文字列の変更が行われ たかどうかをチェック.ポインタの値が変わっていれば例外を発生する. * ruby-mode.el: ruby-electric-braceの新設. Thu May 18 12:27:23 1995 Yukihiro Matsumoto <matz@ix-02> * string.c (Fstr_tr): trの置換対象に`\0'を含む時に正しく置換を行わ ないバグがあった.更に置換文字列をASCII順に指定しないと動作しな い問題もあった.結果としてtrを書き換えたので,copyrightの問題は 無くなった(と思う). * gc.c (gc): the_scopeをマークしていなかったので,ローカル変数が間 違って開放される場合があった. * gc.c (mark_locations_array): 若干の高速化. Mon May 15 11:43:49 1995 Yukihiro Matsumoto <matz@ix-02> * ext/extmk.rb.in: Dynamic Loadモジュールのコンパイル用チェックを 行うruby script.autoconfに近い感覚で使える.新しいモジュールを 提供したい人はextの下にディレクトリを作るだけで良い.必須のファ イルはファイル名の一覧を記録した`MANIFEST'というファイルのみ.必 要に応じて`depend'(ファイルの依存関係を記述するファイル gcc -MM の出力),`extconf.rb'(コンパイル用にライブラリと関数の存在チェッ クするファイル)を用意できる. * eval.c (rb_call): rubyメソッドの引数チェック時に未初期化の jmp_bufを使用していた. * parse.y: `or'と`and'の優先順位を同じにした. Wed May 3 18:21:36 1995 Yukihiro Matsumoto (matz@dyna) * dln.c: Linuxでは`__.SYMDEF/'であった. * dln.c: system callのエラーチェックを忘れていた. Wed Apr 26 09:50:56 1995 Yukihiro Matsumoto (matz@ix-02) * parse.y: イテレータブロックの変数宣言を`|'で括るようにした.これ でイテレータ変数がない時は宣言そのものを省略できる.文法の変更は 久しぶりだ. Tue Apr 25 12:04:17 1995 Yukihiro Matsumoto (matz@ix-02) * eval.c(require): loadからダイナミックロードの機能を移してきた. さらに拡張子の補完機能を追加してユーザがdln/dlopenの差を意識する 必要のないようにした. * string.c(sub,sub): イテレータとしても動作するように. * object.c: init_object -> initialize. Mon Apr 24 14:22:39 1995 Yukihiro Matsumoto (matz@ix-02) * NEWS-OS 3.4対応 * io.c: Solarisのstdioの動作が違うようだ.signalでEOFを返してしま う….perlでも同様の問題がある. Fri Apr 21 20:04:39 1995 Yukihiro Matsumoto (matz@ix-02) * version 0.75 * signal.c: trapがなくなっていた.うーむ. * configure: Solaris 2.3対応. * io.c: #elifのないcppもある. * dir.c: autoconf 2.xへの対応が不十分 Thu Apr 20 12:31:24 1995 Yukihiro Matsumoto (matz@ix-02) * version 0.74 * env.h, gc.c, regex.c: IRIXへの移植対応 * configure: picを生成するoptionの検出のため,システムタイプをチェッ クするように. Tue Apr 18 19:08:17 1995 Yukihiro Matsumoto (matz@ix-02) * gc.c(xrealloc): ptr=nilの時,malloc()と同じ働きを * array.c(astore): 空の配列の0番目の要素に代入するとsize=0で realloc()を呼んでいた. * configure, glob.c: Solaris 2.xでコンパイルできるように
Diffstat (limited to 'sample/from.rb')
-rwxr-xr-xsample/from.rb140
1 files changed, 108 insertions, 32 deletions
diff --git a/sample/from.rb b/sample/from.rb
index df82d5a..f21b1d1 100755
--- a/sample/from.rb
+++ b/sample/from.rb
@@ -1,7 +1,5 @@
#! /usr/local/bin/ruby
-$= = TRUE
-
module ParseDate
MONTHS = {
'jan' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4,
@@ -10,7 +8,7 @@ module ParseDate
MONTHPAT = MONTHS.keys.join('|')
DAYPAT = 'mon|tue|wed|thu|fri|sat|sun'
- def ParseDate.parsedate(date)
+ def parsedate(date)
if date.sub(/(#{DAYPAT})/i, ' ')
dayofweek = $1
end
@@ -20,13 +18,13 @@ module ParseDate
if date =~ /19(\d\d)/
year = $1
end
- if date.sub(/\s*(\d+)\s+(#{MONTHPAT})\S*\s+/, ' ')
+ if date.sub(/\s*(\d+)\s+(#{MONTHPAT})\S*\s+/i, ' ')
dayofmonth = $1
monthname = $2
- elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\s+/, ' ')
+ elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\s+/i, ' ')
monthname = $1
dayofmonth = $2
- elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\D+/, ' ')
+ elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\D+/i, ' ')
monthname = $1
dayofmonth = $2
elsif date.sub(/\s*(\d\d?)\/(\d\d?)/, ' ')
@@ -44,52 +42,130 @@ module ParseDate
end
- def parsedate(date)
- ParseDate.parsedate(date)
+include ParseDate
+
+def decode64(str)
+ e = -1;
+ c = ","
+ for line in str.split("\n")
+ line.tr 'A-Za-z0-9+/', "\000-\377"
+ line.each_byte { |ch|
+ e+=1
+ if e==0
+ c = ch << 2
+ elsif e==1
+ c |= ch >>4
+ string += [c].pack('c')
+ c = ch << 4
+ elsif e == 2
+ c |= ch >> 2
+ string += [c].pack('c');
+ c = ch << 6
+ elsif e==3
+ c |= ch
+ string += [c].pack('c')
+ e = -1;
+ end
+ }
+ end
+ return string;
+end
+
+def j2e(str)
+ while str =~ /\033\$B([^\033]*)\033\(B/
+ s = $1
+ pre, post = $`, $'
+ s.gsub(/./) { |ch|
+ (ch[0]|0x80).chr
+ }
+ str = pre + s + post
end
+ str
+end
-# include ParseDate
+def decode_b(str)
+ while str =~ /=\?ISO-2022-JP\?B\?(.*)=\?=/
+ pre, post = $`, $'
+ s = decode64($1)
+ str = pre + s + post
+ end
+ j2e(str)
+end
if $ARGV[0] == '-w'
wait = TRUE
$ARGV.shift
end
+class Mail
+
+ def Mail.new(f)
+ if !f.is_kind_of(IO)
+ f = open(f, "r")
+ me = super
+ f.close
+ else
+ me = super
+ end
+ return me
+ end
+
+ def initialize(f)
+ @header = {}
+ @body = []
+ while f.gets()
+ $_.chop
+ continue if /^From / # skip From-line
+ break if /^[ \t]*$/ # end of header
+ if /^(\S+):\s*(.*)/
+ @header[attr = $1.capitalize] = $2
+ elsif attr
+ sub(/^\s*/, '')
+ @header[attr] += "\n" + $_
+ end
+ end
+
+ return if ! $_
+
+ while f.gets()
+ break if /^From /
+ @body.push($_)
+ end
+ end
+
+ def header
+ return @header
+ end
+
+ def body
+ return @body
+ end
+
+end
+
$ARGV[0] = '/usr/spool/mail/' + ENV['USER'] if $ARGV.length == 0
$outcount = 0;
def fromout(date, from, subj)
+ return if !date
y = m = d = 0
y, m, d = parsedate(date) if date
from = "sombody@somewhere" if ! from
subj = "(nil)" if ! subj
- printf "%-2d/%02d/%02d [%-28.28s] %-40.40s\n", y, m, d, from, subj
+ from = decode_b(from)
+ subj = decode_b(subj)
+ printf "%-02d/%02d/%02d [%-28.28s] %-40.40s\n", y, m, d, from, subj
$outcount += 1
end
-
-while TRUE
- fields = {}
- while gets()
- $_.chop
- continue if /^From / # skip From-line
- break if /^[ \t]*$/ # end of header
- if /^(\S+):\s*(.*)/
- fields[attr = $1] = $2
- elsif attr
- sub(/^\s*/, '')
- fields[attr] += "\n" + $_
- end
- end
- break if ! $_
-
- fromout fields['Date'], fields['From'], fields['Subject']
-
- while gets()
- break if /^From /
+for file in $ARGV
+ continue if !File.exists(file)
+ f = open(file, "r")
+ while !f.eof
+ mail = Mail.new(f)
+ fromout mail.header['Date'], mail.header['From'], mail.header['Subject']
end
-
- break if ! $_
+ f.close
end
if $outcount == 0