* io.c (rb_open_file): encoding in mode string was ignored if perm is
[ruby-svn.git] / ext / digest / lib / digest.rb
blob0c4ee3c2cc29f474321e42907a7322e37af78a91
1 require 'digest.so'
3 module Digest
4   def self.const_missing(name)
5     case name
6     when :SHA256, :SHA384, :SHA512
7       lib = 'digest/sha2.so'
8     else
9       lib = File.join('digest', name.to_s.downcase)
10     end
12     begin
13       require lib
14     rescue LoadError => e
15       raise LoadError, "library not found for class Digest::#{name} -- #{lib}", caller(1)
16     end
17     unless Digest.const_defined?(name)
18       raise NameError, "uninitialized constant Digest::#{name}", caller(1)
19     end
20     Digest.const_get(name)
21   end
23   class ::Digest::Class
24     # creates a digest object and reads a given file, _name_.
25     # 
26     #  p Digest::SHA256.file("X11R6.8.2-src.tar.bz2").hexdigest
27     #  # => "f02e3c85572dc9ad7cb77c2a638e3be24cc1b5bea9fdbb0b0299c9668475c534"
28     def self.file(name)
29       new.file(name)
30     end
31   end
33   module Instance
34     # updates the digest with the contents of a given file _name_ and
35     # returns self.
36     def file(name)
37       File.open(name, "rb") {|f|
38         buf = ""
39         while f.read(16384, buf)
40           update buf
41         end
42       }
43       self
44     end
45   end
46 end
48 def Digest(name)
49   Digest.const_get(name)
50 end