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