]> gitweb.factorcode.org Git - factor.git/blob - basis/checksums/crc16/crc16.factor
endian: replaces io.binary and io.binary.fast.
[factor.git] / basis / checksums / crc16 / crc16.factor
1 ! Copyright (C) 2016 Alexander Ilin.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: checksums endian kernel math sequences sequences.private ;
4 IN: checksums.crc16
5
6 CONSTANT: crc16-polynomial 0xa001
7
8 CONSTANT: crc16-table V{ }
9
10 256 <iota> [
11     8 [
12         [ 2/ ] [ even? ] bi [ crc16-polynomial bitxor ] unless
13     ] times
14 ] map 0 crc16-table copy
15
16 : (crc16) ( crc ch -- crc )
17     dupd bitxor
18     0xff bitand crc16-table nth-unsafe
19     swap -8 shift bitxor ; inline
20
21 SINGLETON: crc16
22
23 INSTANCE: crc16 checksum
24
25 : init-crc16 ( input checksum -- x input )
26     drop [ 0xffff ] dip ; inline
27
28 : finish-crc16 ( x -- bytes )
29     2 >le ; inline
30
31 M: crc16 checksum-bytes
32     init-crc16
33     [ (crc16) ] each
34     finish-crc16 ; inline
35
36 M: crc16 checksum-lines
37     init-crc16
38     [ [ (crc16) ] each CHAR: \n (crc16) ] each
39     finish-crc16 ; inline