]> gitweb.factorcode.org Git - factor.git/blob - basis/checksums/crc16/crc16.factor
415a4090a4a3b00ee4fec99639ea36e31faf3832
[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 io.binary kernel math sequences
4 sequences.private ;
5 IN: checksums.crc16
6
7 CONSTANT: crc16-polynomial 0xa001
8
9 CONSTANT: crc16-table V{ }
10
11 256 <iota> [
12     8 [
13         [ 2/ ] [ even? ] bi [ crc16-polynomial bitxor ] unless
14     ] times
15 ] map 0 crc16-table copy
16
17 : (crc16) ( crc ch -- crc )
18     dupd bitxor
19     mask-byte crc16-table nth-unsafe
20     swap -8 shift bitxor ; inline
21
22 SINGLETON: crc16
23
24 INSTANCE: crc16 checksum
25
26 : init-crc16 ( input checksum -- x input )
27     drop [ 0xffff ] dip ; inline
28
29 : finish-crc16 ( x -- bytes )
30     2 >le ; inline
31
32 M: crc16 checksum-bytes
33     init-crc16
34     [ (crc16) ] each
35     finish-crc16 ; inline
36
37 M: crc16 checksum-lines
38     init-crc16
39     [ [ (crc16) ] each CHAR: \n (crc16) ] each
40     finish-crc16 ; inline