c_extensions/c_digests_no_parens.rb
tests/_examples/c_extensions/c_digests_no_parens.rb in the metorex repository.
# A C extension adding a digest algorithm through Digest::Base, and Fiddle
# reading memory at an address.
require "tmpdir"
require "fiddle"
require_relative "build_helper"
directory = Dir.mktmpdir
require build_extension("c_digests.c", "c_digests", directory)
fold = Digest::Fold.new
p([fold.digest_length, fold.block_length, Digest::Fold.superclass, Digest::MD5.superclass])
fold.update "abcd"
fold << "e"
p fold.hexdigest
p Digest::Fold.hexdigest("abcd")
p Digest::Fold.new("ab").digest.bytes
fold.reset
p fold.digest.bytes
p Digest::MD5.hexdigest("abc")
begin
Digest::Base.new "abc"
rescue NotImplementedError => error
p([error.class, error.message])
end
address = CDigests.new.marker_address
pointer = Fiddle::Pointer.new(address)
p([pointer.to_i == address, pointer.size, Fiddle::Pointer[address].to_i == address])
p([pointer[0], pointer[1].chr, pointer[0, 6]])
FileUtils.rm_rf directory
Output:
[5, 8, Digest::Base, Digest::Base]
"0462636405"
"6162636404"
[97, 98, 0, 0, 2]
[0, 0, 0, 0, 0]
"900150983cd24fb0d6963f7d28e17f72"
[NotImplementedError, "Digest::Base is an abstract class"]
[true, 0, true]
[109, "a", "marker"]