]> gitweb.factorcode.org Git - factor.git/blob - core/checksums/crc32/crc32.factor
e1f0b9417bf3c958c66a730f032b582ce4f57344
[factor.git] / core / checksums / crc32 / crc32.factor
1 ! Copyright (C) 2006 Doug Coleman
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel math sequences sequences.private namespaces
4 words io io.binary io.files io.streams.string quotations
5 definitions checksums ;
6 IN: checksums.crc32
7
8 : crc32-polynomial HEX: edb88320 ; inline
9
10 : crc32-table V{ } ; inline
11
12 256 [
13     8 [
14         dup even? >r 2/ r> [ crc32-polynomial bitxor ] unless
15     ] times >bignum
16 ] map 0 crc32-table copy
17
18 : (crc32) ( crc ch -- crc )
19     >bignum dupd bitxor
20     mask-byte crc32-table nth-unsafe >bignum
21     swap -8 shift bitxor ; inline
22
23 SINGLETON: crc32
24
25 INSTANCE: crc32 checksum
26
27 : init-crc32 drop >r HEX: ffffffff dup r> ; inline
28
29 : finish-crc32 bitxor 4 >be ; inline
30
31 M: crc32 checksum-bytes
32     init-crc32
33     [ (crc32) ] each
34     finish-crc32 ;
35
36 M: crc32 checksum-lines
37     init-crc32
38     [ [ (crc32) ] each CHAR: \n (crc32) ] each
39     finish-crc32 ;