[add md5 summing of lazy bytestreams
John Meacham <john@repetae.net>**20080211185259] hunk ./Support/MD5.hs 2
-module Support.MD5(Hash(),emptyHash,md5,md5file,md5Bytes,md5String,md5Handle,hashToBytes) where
+module Support.MD5(Hash(),emptyHash,md5,md5file,md5lazy,md5Bytes,md5String,md5Handle,hashToBytes) where
hunk ./Support/MD5.hs 5
+import qualified Data.ByteString.Lazy as LBS
hunk ./Support/MD5.hs 26
+md5lazy :: LBS.ByteString -> Hash
+md5lazy lbs = unsafePerformIO $ do
+    allocaBytes (fromIntegral $ get_md5_statesize) $ \msp -> do
+        let ms = MState msp
+        md5_init ms
+        forM_ (LBS.toChunks lbs) $ \bs -> do
+            BS.unsafeUseAsCStringLen bs $ \ (x,y) -> md5_append ms (castPtr x) (fromIntegral y)
+        allocaBytes 16 $ \digest -> do
+            md5_finish ms digest
+            readDigest digest
+
hunk ./Support/MD5.hs 57
-md5file fp = md5 `fmap` BS.readFile fp
+md5file fp = md5lazy `fmap` LBS.readFile fp
hunk ./Support/MD5.hs 59
+newtype MState = MState (Ptr MState)
hunk ./Support/MD5.hs 62
+foreign import ccall unsafe md5_init  :: MState -> IO ()
+foreign import ccall unsafe md5_append :: MState -> Ptr Word8 -> CInt -> IO ()
+foreign import ccall unsafe md5_finish :: MState -> Ptr Word8 -> IO ()
+foreign import ccall unsafe get_md5_statesize :: CInt
hunk ./cbits/md5sum.c 3
+ *
hunk ./cbits/md5sum.c 44
+int get_md5_statesize(void) { return sizeof(md5_state_t); }
+
hunk ./cbits/md5sum.c 47
-static void md5_init(md5_state_t *pms);
+void md5_init(md5_state_t *pms);
hunk ./cbits/md5sum.c 50
-static void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
+void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
hunk ./cbits/md5sum.c 53
-static void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);
+void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);
hunk ./cbits/md5sum.c 315
-static void
+void
hunk ./cbits/md5sum.c 325
-static void
+void
hunk ./cbits/md5sum.c 363
-static void
+void