2008-04-30 17:11:55 -04:00
|
|
|
! Copyright (c) 2008 Slava Pestov
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2016-07-30 12:31:10 -04:00
|
|
|
USING: accessors byte-vectors io io.backend io.encodings.binary
|
|
|
|
io.files io.streams.byte-array kernel sequences ;
|
2008-04-30 17:11:55 -04:00
|
|
|
IN: checksums
|
|
|
|
|
|
|
|
MIXIN: checksum
|
|
|
|
|
|
|
|
GENERIC: checksum-bytes ( bytes checksum -- value )
|
|
|
|
GENERIC: checksum-stream ( stream checksum -- value )
|
|
|
|
GENERIC: checksum-lines ( lines checksum -- value )
|
|
|
|
|
2016-06-30 14:41:27 -04:00
|
|
|
M: checksum checksum-bytes
|
|
|
|
[ binary <byte-reader> ] dip checksum-stream ;
|
|
|
|
|
2008-11-23 03:44:56 -05:00
|
|
|
M: checksum checksum-stream
|
2009-05-01 11:41:27 -04:00
|
|
|
[ stream-contents ] dip checksum-bytes ;
|
2008-04-30 17:11:55 -04:00
|
|
|
|
2008-11-23 03:44:56 -05:00
|
|
|
M: checksum checksum-lines
|
|
|
|
[ B{ CHAR: \n } join ] dip checksum-bytes ;
|
2008-04-30 17:11:55 -04:00
|
|
|
|
2008-05-01 21:02:34 -04:00
|
|
|
: checksum-file ( path checksum -- value )
|
2016-06-30 14:41:27 -04:00
|
|
|
[ binary <file-reader> ] dip checksum-stream ;
|
2016-07-30 12:31:10 -04:00
|
|
|
|
|
|
|
TUPLE: checksum-state checksum { bytes byte-vector } ;
|
|
|
|
|
|
|
|
M: checksum-state clone
|
|
|
|
call-next-method
|
|
|
|
[ clone ] change-bytes ;
|
|
|
|
|
|
|
|
: new-checksum-state ( class -- checksum-state )
|
|
|
|
new BV{ } clone >>bytes ;
|
|
|
|
|
|
|
|
GENERIC: initialize-checksum-state ( checksum -- checksum-state )
|
|
|
|
GENERIC# add-checksum-bytes 1 ( checksum-state data -- checksum-state )
|
|
|
|
GENERIC: get-checksum ( checksum-state -- value )
|
|
|
|
|
|
|
|
: add-checksum-stream ( checksum-state stream -- checksum-state )
|
|
|
|
[ [ add-checksum-bytes ] each-block ] with-input-stream ;
|
|
|
|
|
|
|
|
: add-checksum-lines ( checksum-state lines -- checksum-state )
|
|
|
|
[ B{ CHAR: \n } add-checksum-bytes ]
|
|
|
|
[ add-checksum-bytes ] interleave ;
|
|
|
|
|
|
|
|
: add-checksum-file ( checksum-state path -- checksum-state )
|
|
|
|
binary <file-reader> add-checksum-stream ;
|
|
|
|
|
|
|
|
M: checksum initialize-checksum-state
|
|
|
|
checksum-state new-checksum-state swap >>checksum ;
|
|
|
|
|
|
|
|
M: checksum-state add-checksum-bytes
|
|
|
|
over bytes>> push-all ;
|
|
|
|
|
|
|
|
M: checksum-state get-checksum
|
|
|
|
[ bytes>> ] [ checksum>> ] bi checksum-bytes ;
|