source: project/release/4/crc/tags/1.0.1/crc.scm @ 30538

Last change on this file since 30538 was 30538, checked in by Kon Lovett, 7 years ago

add test, symbolic names for consts

File size: 5.1 KB
Line 
1;;;; crc.scm
2
3(module crc
4
5  (;export
6        crc32)
7
8  (import scheme chicken foreign)
9
10#>
11/* from RFC2083 */
12
13/* Table of CRCs of all 8-bit messages. */
14static
15uint32_t crc_table[256] = {
16    0UL, 1996959894UL, 3993919788UL, 2567524794UL, 124634137UL, 1886057615UL,
17    3915621685UL, 2657392035UL, 249268274UL, 2044508324UL, 3772115230UL,
18    2547177864UL, 162941995UL, 2125561021UL, 3887607047UL, 2428444049UL,
19    498536548UL, 1789927666UL, 4089016648UL, 2227061214UL, 450548861UL,
20    1843258603UL, 4107580753UL, 2211677639UL, 325883990UL, 1684777152UL,
21    4251122042UL, 2321926636UL, 335633487UL, 1661365465UL, 4195302755UL,
22    2366115317UL, 997073096UL, 1281953886UL, 3579855332UL, 2724688242UL,
23    1006888145UL, 1258607687UL, 3524101629UL, 2768942443UL, 901097722UL,
24    1119000684UL, 3686517206UL, 2898065728UL, 853044451UL, 1172266101UL,
25    3705015759UL, 2882616665UL, 651767980UL, 1373503546UL, 3369554304UL,
26    3218104598UL, 565507253UL, 1454621731UL, 3485111705UL, 3099436303UL,
27    671266974UL, 1594198024UL, 3322730930UL, 2970347812UL, 795835527UL,
28    1483230225UL, 3244367275UL, 3060149565UL, 1994146192UL, 31158534UL,
29    2563907772UL, 4023717930UL, 1907459465UL, 112637215UL, 2680153253UL,
30    3904427059UL, 2013776290UL, 251722036UL, 2517215374UL, 3775830040UL,
31    2137656763UL, 141376813UL, 2439277719UL, 3865271297UL, 1802195444UL,
32    476864866UL, 2238001368UL, 4066508878UL, 1812370925UL, 453092731UL,
33    2181625025UL, 4111451223UL, 1706088902UL, 314042704UL, 2344532202UL,
34    4240017532UL, 1658658271UL, 366619977UL, 2362670323UL, 4224994405UL,
35    1303535960UL, 984961486UL, 2747007092UL, 3569037538UL, 1256170817UL,
36    1037604311UL, 2765210733UL, 3554079995UL, 1131014506UL, 879679996UL,
37    2909243462UL, 3663771856UL, 1141124467UL, 855842277UL, 2852801631UL,
38    3708648649UL, 1342533948UL, 654459306UL, 3188396048UL, 3373015174UL,
39    1466479909UL, 544179635UL, 3110523913UL, 3462522015UL, 1591671054UL,
40    702138776UL, 2966460450UL, 3352799412UL, 1504918807UL, 783551873UL,
41    3082640443UL, 3233442989UL, 3988292384UL, 2596254646UL, 62317068UL,
42    1957810842UL, 3939845945UL, 2647816111UL, 81470997UL, 1943803523UL,
43    3814918930UL, 2489596804UL, 225274430UL, 2053790376UL, 3826175755UL,
44    2466906013UL, 167816743UL, 2097651377UL, 4027552580UL, 2265490386UL,
45    503444072UL, 1762050814UL, 4150417245UL, 2154129355UL, 426522225UL,
46    1852507879UL, 4275313526UL, 2312317920UL, 282753626UL, 1742555852UL,
47    4189708143UL, 2394877945UL, 397917763UL, 1622183637UL, 3604390888UL,
48    2714866558UL, 953729732UL, 1340076626UL, 3518719985UL, 2797360999UL,
49    1068828381UL, 1219638859UL, 3624741850UL, 2936675148UL, 906185462UL,
50    1090812512UL, 3747672003UL, 2825379669UL, 829329135UL, 1181335161UL,
51    3412177804UL, 3160834842UL, 628085408UL, 1382605366UL, 3423369109UL,
52    3138078467UL, 570562233UL, 1426400815UL, 3317316542UL, 2998733608UL,
53    733239954UL, 1555261956UL, 3268935591UL, 3050360625UL, 752459403UL,
54    1541320221UL, 2607071920UL, 3965973030UL, 1969922972UL, 40735498UL,
55    2617837225UL, 3943577151UL, 1913087877UL, 83908371UL, 2512341634UL,
56    3803740692UL, 2075208622UL, 213261112UL, 2463272603UL, 3855990285UL,
57    2094854071UL, 198958881UL, 2262029012UL, 4057260610UL, 1759359992UL,
58    534414190UL, 2176718541UL, 4139329115UL, 1873836001UL, 414664567UL,
59    2282248934UL, 4279200368UL, 1711684554UL, 285281116UL, 2405801727UL,
60    4167216745UL, 1634467795UL, 376229701UL, 2685067896UL, 3608007406UL,
61    1308918612UL, 956543938UL, 2808555105UL, 3495958263UL, 1231636301UL,
62    1047427035UL, 2932959818UL, 3654703836UL, 1088359270UL, 936918000UL,
63    2847714899UL, 3736837829UL, 1202900863UL, 817233897UL, 3183342108UL,
64    3401237130UL, 1404277552UL, 615818150UL, 3134207493UL, 3453421203UL,
65    1423857449UL, 601450431UL, 3009837614UL, 3294710456UL, 1567103746UL,
66    711928724UL, 3020668471UL, 3272380065UL, 1510334235UL, 755167117UL};
67
68#define CRCPOLY   0xEDB88320L
69#define CRCINV    0x5B358FD3L // inverse poly of (x^N) mod CRCPOLY
70#define INITXOR   0xFFFFFFFFL
71#define FINALXOR  0xFFFFFFFFL
72
73#if 0
74/* Flag: has the table been computed? Initially false. */
75static
76int crc_table_computed = 0;
77
78/* Make the table for a fast CRC. */
79static
80void make_crc_table(void)
81{
82  uint32_t c;
83  int n, k;
84  for (n = 0; n < 256; n++) {
85    c = (uint32_t) n;
86    for (k = 0; k < 8; k++) {
87      if (c & 1)
88        c = CRCPOLY ^ (c >> 1);
89      else
90        c >>= 1;
91    }
92    crc_table[n] = c;
93  }
94  crc_table_computed = 1;
95}
96#endif
97
98/* Update a running CRC with the bytes buf[0..len-1]--the CRC
99   should be initialized to all 1's, and the transmitted value
100   is the 1's complement of the final running CRC (see the
101   crc() routine below). */
102
103static
104uint32_t update_crc(uint32_t crc, uint8_t *buf, int len)
105{
106  uint32_t c = crc;
107  int n;
108
109  /*if (!crc_table_computed) make_crc_table();*/
110  for (n = 0; n < len; n++) {
111    c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
112  }
113  return c;
114}
115
116/* Return the CRC of the bytes buf[0..len-1]. */
117static
118uint32_t crc(uint8_t *buf, int len)
119{
120  return update_crc(INITXOR, buf, len) ^ FINALXOR;
121}
122<#
123
124(define (crc32 str #!optional (len (##sys#size str)))
125  ((foreign-lambda unsigned-integer32 "crc" nonnull-scheme-pointer int) str len) )
126
127) ;module crc
Note: See TracBrowser for help on using the repository browser.