mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	https://github.com/ruby/ruby/pull/364 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42086 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			113 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
#! /usr/local/bin/ruby
 | 
						|
 | 
						|
require "time"
 | 
						|
require "kconv"
 | 
						|
 | 
						|
class String
 | 
						|
  def kjust(len)
 | 
						|
    res = ''
 | 
						|
    rlen = 0
 | 
						|
    self.each_char do |char|
 | 
						|
      delta = char.bytesize > 1 ? 2 : 1
 | 
						|
      break if rlen + delta > len
 | 
						|
      rlen += delta
 | 
						|
      res += char
 | 
						|
    end
 | 
						|
    res += ' ' * (len - rlen) if rlen < len
 | 
						|
    res
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
def fromout(date, from, subj)
 | 
						|
  return 0 if !date
 | 
						|
  y, m, d = Time.parse(date).to_a.reverse[4, 3] if date
 | 
						|
  y ||= 0; m ||= 0; d ||= 0
 | 
						|
  from ||= "sombody@somewhere"
 | 
						|
  from.delete!("\r\n")
 | 
						|
  from = from.kconv(Encoding.default_external).kjust(28)
 | 
						|
  subj ||= "(nil)"
 | 
						|
  subj.delete!("\r\n")
 | 
						|
  subj = subj.kconv(Encoding.default_external).kjust(40)
 | 
						|
  printf "%02d/%02d/%02d [%s] %s\n", y%100, m, d, from, subj
 | 
						|
  return 1
 | 
						|
end
 | 
						|
 | 
						|
def get_mailfile(user)
 | 
						|
  file = user
 | 
						|
  unless user
 | 
						|
    file = ENV['MAIL']
 | 
						|
    user = ENV['USER'] || ENV['USERNAME'] || ENV['LOGNAME']
 | 
						|
  end
 | 
						|
 | 
						|
  if file == nil or !File.exist?(file)
 | 
						|
    [ENV['SPOOLDIR'], '/usr/spool', '/var/spool', '/usr', '/var'].each do |m|
 | 
						|
      path = "#{m}/mail/#{user}"
 | 
						|
      if File.exist?(path)
 | 
						|
        file = path
 | 
						|
        break
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
  file
 | 
						|
end
 | 
						|
 | 
						|
def from_main
 | 
						|
  if ARGV[0] == '-w'
 | 
						|
    wait = true
 | 
						|
    ARGV.shift
 | 
						|
  end
 | 
						|
  file = get_mailfile(ARGV[0])
 | 
						|
 | 
						|
  outcount = 0
 | 
						|
  if File.exist?(file)
 | 
						|
    atime = File.atime(file)
 | 
						|
    mtime = File.mtime(file)
 | 
						|
    open(file, "r") do |f|
 | 
						|
      until f.eof?
 | 
						|
        header = {}
 | 
						|
        f.each_line do |line|
 | 
						|
          next if /^From / =~ line # skip From-line
 | 
						|
          break if /^$/ =~ line	 # end of header
 | 
						|
 | 
						|
          if /^(?<attr>\S+?):\s*(?<value>.*)/ =~ line
 | 
						|
            attr.capitalize!
 | 
						|
            header[attr] = value
 | 
						|
          elsif attr
 | 
						|
            header[attr] += "\n" + line.lstrip
 | 
						|
          end
 | 
						|
        end
 | 
						|
 | 
						|
        f.each_line do |line|
 | 
						|
          break if /^From / =~ line
 | 
						|
        end
 | 
						|
        outcount += fromout(header['Date'], header['From'], header['Subject'])
 | 
						|
      end
 | 
						|
    end
 | 
						|
    File.utime(atime, mtime, file)
 | 
						|
  end
 | 
						|
 | 
						|
  if outcount == 0
 | 
						|
    print "You have no mail.\n"
 | 
						|
    sleep 2 if wait
 | 
						|
  elsif wait
 | 
						|
    system "stty cbreak -echo"
 | 
						|
    $stdin.getc
 | 
						|
    system "stty cooked echo"
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
if __FILE__ == $0
 | 
						|
  from_main
 | 
						|
end
 | 
						|
 | 
						|
__END__
 | 
						|
 | 
						|
=begin
 | 
						|
 | 
						|
= from.rb
 | 
						|
 | 
						|
== USAGE
 | 
						|
 | 
						|
ruby from.rb [-w] [username_or_filename]
 | 
						|
 | 
						|
=end
 |