diff --git a/basis/checksums/common/common.factor b/basis/checksums/common/common.factor index 104dadcf1d..511910ec6e 100644 --- a/basis/checksums/common/common.factor +++ b/basis/checksums/common/common.factor @@ -1,8 +1,7 @@ ! Copyright (C) 2006, 2008 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors byte-arrays byte-vectors checksums destructors -grouping io io.backend io.binary io.encodings.binary io.files -kernel make math sequences locals ; +USING: accessors byte-arrays byte-vectors checksums grouping +io.binary kernel locals make math sequences ; IN: checksums.common : calculate-pad-length ( length -- length' ) @@ -23,8 +22,6 @@ TUPLE: block-checksum-state < checksum-state { bytes-read integer } { block-size integer } ; -M: block-checksum-state dispose drop ; - GENERIC: checksum-block ( bytes checksum-state -- ) ! Update the bytes-read before calculating checksum in case @@ -48,11 +45,7 @@ M:: block-checksum-state add-checksum-bytes ( state data -- state ) remain [ >byte-vector ] [ BV{ } clone ] if* >>bytes ; M: block-checksum checksum-bytes - initialize-checksum-state [ - swap add-checksum-bytes get-checksum - ] with-disposal ; + [ swap add-checksum-bytes get-checksum ] with-checksum-state ; M: block-checksum checksum-stream - initialize-checksum-state [ - swap add-checksum-stream get-checksum - ] with-disposal ; + [ swap add-checksum-stream get-checksum ] with-checksum-state ; diff --git a/core/checksums/checksums.factor b/core/checksums/checksums.factor index 9030f50e6a..3c1d31d7d1 100644 --- a/core/checksums/checksums.factor +++ b/core/checksums/checksums.factor @@ -1,7 +1,8 @@ ! Copyright (c) 2008 Slava Pestov ! See http://factorcode.org/license.txt for BSD license. -USING: accessors byte-vectors io io.backend io.encodings.binary -io.files io.streams.byte-array kernel sequences ; +USING: accessors byte-vectors destructors io io.backend +io.encodings.binary io.files io.streams.byte-array kernel +sequences ; IN: checksums MIXIN: checksum @@ -24,6 +25,8 @@ M: checksum checksum-lines TUPLE: checksum-state checksum { bytes byte-vector } ; +M: checksum-state dispose drop ; + M: checksum-state clone call-next-method [ clone ] change-bytes ; @@ -35,6 +38,9 @@ GENERIC: initialize-checksum-state ( checksum -- checksum-state ) GENERIC# add-checksum-bytes 1 ( checksum-state data -- checksum-state ) GENERIC: get-checksum ( checksum-state -- value ) +: with-checksum-state ( ... checksum quot: ( ... checksum-state -- ..b ) -- ..b value ) + [ initialize-checksum-state ] dip with-disposal ; inline + : add-checksum-stream ( checksum-state stream -- checksum-state ) [ [ add-checksum-bytes ] each-block ] with-input-stream ;