From: Robert Feldt Date: 2000-10-21T20:32:41+09:00 Subject: [ruby-talk:5731] MD5 Marshaling Hi, I needed marshaling on MD5 objects so made a small (and simplistic!) patch. Works for me and may be useful for others. Patch and very small test below. Regards, Robert patch_md5init: *** md5init.c Sat Oct 21 13:19:40 2000 --- ../md5_old/md5init.c Sat Oct 21 12:43:52 2000 *************** *** 99,135 **** return obj; } - static VALUE - md5_dump(self, aDepth) - VALUE self; - VALUE aDepth; - { - MD5_CTX *md5_context; - - // Get context - Data_Get_Struct(self, MD5_CTX, md5_context); - - // Make string from raw data in context and return as dump - return rb_str_new((char*)md5_context, sizeof(MD5_CTX)); - } - - static VALUE - md5_load(klass, aString) - VALUE klass; - VALUE aString; - { - VALUE obj; - MD5_CTX *md5; - - // Wrap up a context - obj = Data_Make_Struct(klass, MD5_CTX, 0, free, md5); - - // Copy the dumped context - memcpy((char*)md5, RSTRING(aString)->ptr, sizeof(MD5_CTX)); - - return obj; - } - void Init_md5() { --- 99,104 ---- *************** *** 142,148 **** rb_define_method(cMD5, "digest", md5_digest, 0); rb_define_method(cMD5, "hexdigest", md5_hexdigest, 0); rb_define_method(cMD5, "clone", md5_clone, 0); - - rb_define_method(cMD5, "_dump", md5_dump, 1); - rb_define_singleton_method(cMD5, "_load", md5_load, 1); } --- 111,114 ---- test_md5_marshaling.rb: require 'md5' md1 = MD5.new md1.update "Simplest possible test!" md2 = Marshal.load(Marshal.dump(md1)) md1.update "Now we'll see!" md2.update "Now we'll see!" if md1.hexdigest != md2.hexdigest puts "ERROR! Digests differ" else puts "Test succeeded. Marshaling of MD5 seems to work" end