c_extensions/c_digests.rb
tests/_examples/c_extensions/c_digests.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"]