1 ! Copyright (c) 2008 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors io io.backend io.files kernel math math.parser
4 sequences byte-arrays byte-vectors quotations ;
10 { bytes-read integer } { block-size integer } { bytes byte-vector } ;
12 : new-checksum-state ( class -- checksum-state )
14 BV{ } clone >>bytes ; inline
16 M: checksum-state clone
18 [ clone ] change-bytes ;
20 GENERIC: initialize-checksum-state ( class -- checksum-state )
22 GENERIC: checksum-block ( bytes checksum -- )
24 GENERIC: get-checksum ( checksum -- value )
26 : add-checksum-bytes ( checksum-state data -- checksum-state )
27 over bytes>> [ push-all ] keep
28 [ dup length pick block-size>> >= ]
30 over block-size>> cut-slice [ >byte-array ] dip [
31 over [ checksum-block ]
32 [ [ ] [ block-size>> ] bi [ + ] curry change-bytes-read drop ] bi
36 [ >>bytes ] [ length [ + ] curry change-bytes-read ] bi ;
38 : add-checksum-stream ( checksum-state stream -- checksum-state )
40 [ [ swap add-checksum-bytes drop ] curry each-block ] keep
43 : add-checksum-file ( checksum-state path -- checksum-state )
44 normalize-path (file-reader) add-checksum-stream ;
46 GENERIC: checksum-bytes ( bytes checksum -- value )
48 GENERIC: checksum-stream ( stream checksum -- value )
50 GENERIC: checksum-lines ( lines checksum -- value )
52 M: checksum checksum-stream
53 [ stream-contents ] dip checksum-bytes ;
55 M: checksum checksum-lines
56 [ B{ CHAR: \n } join ] dip checksum-bytes ;
58 : checksum-file ( path checksum -- value )
59 #! normalize-path (file-reader) is equivalent to
60 #! binary <file-reader>. We use the lower-level form
61 #! so that we can move io.encodings.binary to basis/.
62 [ normalize-path (file-reader) ] dip checksum-stream ;
64 : hex-string ( seq -- str )
65 [ >hex 2 CHAR: 0 pad-head ] { } map-as concat ;