* io.c (rb_open_file): encoding in mode string was ignored if perm is
[ruby-svn.git] / sample / from.rb
blobaa93e6726a231e232170d2b0f57990d3769289b9
1 #! /usr/local/bin/ruby
3 require "time"
4 require "kconv"
6 class String
7   def kjust(len)
8     res = ''
9     rlen = 0
10     self.each_char do |char|
11       delta = char.bytesize > 1 ? 2 : 1
12       break if rlen + delta > len
13       rlen += delta
14       res += char
15     end
16     res += ' ' * (len - rlen) if rlen < len
17     res
18   end
19 end
21 def fromout(date, from, subj)
22   return 0 if !date
23   y, m, d = Time.parse(date).to_a.reverse[4, 3] if date
24   y ||= 0; m ||= 0; d ||= 0
25   from ||= "sombody@somewhere"
26   from.delete!("\r\n")
27   from = from.kconv(Encoding.default_external).kjust(28)
28   subj ||= "(nil)"
29   subj.delete!("\r\n")
30   subj = subj.kconv(Encoding.default_external).kjust(40)
31   printf "%02d/%02d/%02d [%s] %s\n", y%100, m, d, from, subj
32   return 1
33 end
35 def get_mailfile(user)
36   file = user
37   unless user
38     file = ENV['MAIL']
39     user = ENV['USER'] || ENV['USERNAME'] || ENV['LOGNAME'] 
40   end
42   if file == nil or !File.exist?(file)
43     [ENV['SPOOLDIR'], '/usr/spool', '/var/spool', '/usr', '/var'].each do |m|
44       path = "#{m}/mail/#{user}"
45       if File.exist?(path)
46         file = path
47         break
48       end
49     end
50   end
51   file
52 end
54 def from_main
55   if ARGV[0] == '-w'
56     wait = true
57     ARGV.shift
58   end
59   file = get_mailfile(ARGV[0])
61   outcount = 0
62   if File.exist?(file)
63     atime = File.atime(file)
64     mtime = File.mtime(file)
65     open(file, "r") do |f|
66       until f.eof?
67         header = {}
68         f.each_line do |line|
69           next if /^From / =~ line # skip From-line
70           break if /^$/ =~ line  # end of header
72           if /^(?<attr>\S+?):\s*(?<value>.*)/ =~ line
73             attr.capitalize!
74             header[attr] = value
75           elsif attr
76             header[attr] += "\n" + line.lstrip
77           end
78         end
80         f.each_line do |line|
81           break if /^From / =~ line
82         end
83         outcount += fromout(header['Date'], header['From'], header['Subject'])
84       end
85     end
86     File.utime(atime, mtime, file)
87   end
89   if outcount == 0
90     print "You have no mail.\n"
91     sleep 2 if wait
92   elsif wait
93     system "stty cbreak -echo"
94     $stdin.getc
95     system "stty cooked echo"
96   end
97 end
99 if __FILE__ == $0
100   from_main
103 __END__
105 =begin
107 = from.rb
109 == USAGE
111 ruby from.rb [-w] [username_or_filename]
113 =end