chiark / gitweb /
*** empty log message ***
[mLib] / crc32.c
CommitLineData
0875b58f 1/* -*-c-*-
2 *
3 * $Id: crc32.c,v 1.1 1998/06/17 23:44:42 mdw Exp $
4 *
5 * Calculating cyclic redundancy values (non-cryptographic!)
6 *
7 * (c) 1998 Straylight/Edgeware
8 */
9
10/*----- Licensing notice --------------------------------------------------*
11 *
12 * This file is part of the mLib utilities library.
13 *
14 * mLib is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * mLib is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with mLib; if not, write to the Free Software Foundation,
26 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 */
28
29/*----- Revision history --------------------------------------------------*
30 *
31 * $Log: crc32.c,v $
32 * Revision 1.1 1998/06/17 23:44:42 mdw
33 * Initial revision
34 *
35 */
36
37/*----- Header files ------------------------------------------------------*/
38
39/* --- ANSI headers --- */
40
41#include <stdio.h>
42#include <stdlib.h>
43#include <string.h>
44
45/* --- Local headers --- */
46
47#include "crc32.h"
48
49/*----- CRC table ---------------------------------------------------------*/
50
51/* --- Acknowledgements and information --- *
52 *
53 * This table was generated using a derivative of the Rocksoft Model CRC
54 * generator. The parameters given are:
55 *
56 * width = 32bits
57 * poly = 0x04C11DB7
58 * init = -1
59 * xorout = -1
60 * reverse = yes
61 * check = crc(123456789) = 0xCBF43926
62 */
63
64unsigned long crc32_table[256] = {
65 0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL,
66 0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L,
67 0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L,
68 0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L,
69 0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL,
70 0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L,
71 0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL,
72 0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L,
73 0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L,
74 0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,
75 0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L,
76 0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L,
77 0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L,
78 0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL,
79 0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,
80 0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL,
81 0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL,
82 0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L,
83 0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L,
84 0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,
85 0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL,
86 0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L,
87 0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL,
88 0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L,
89 0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,
90 0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL,
91 0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L,
92 0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L,
93 0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L,
94 0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,
95 0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L,
96 0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL,
97 0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL,
98 0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L,
99 0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,
100 0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L,
101 0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL,
102 0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L,
103 0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL,
104 0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,
105 0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L,
106 0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL,
107 0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L,
108 0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L,
109 0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,
110 0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL,
111 0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L,
112 0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL,
113 0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL,
114 0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,
115 0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L,
116 0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L,
117 0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL,
118 0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L,
119 0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,
120 0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L,
121 0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L,
122 0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL,
123 0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L,
124 0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,
125 0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L,
126 0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL,
127 0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L,
128 0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL,
129};
130
131/*----- Functionc provided ------------------------------------------------*/
132
133/* --- @crc32@ --- *
134 *
135 * Arguments: @unsigned long crc@ = carryover from previous call, or zero
136 * @const void *buf@ = pointer to buffer to check
137 * @size_t sz@ = size of the buffer
138 *
139 * Returns: The CRC updated by the new buffer.
140 *
141 * Use: A restartable CRC calculator. This is just a function
142 * wrapper for the macro version.
143 */
144
145unsigned long crc32(unsigned long crc, const void *buf, size_t sz)
146{
147 unsigned long c;
148 CRC32(c, crc, buf, sz);
149 return (c);
150}
151
152/*----- Test driver -------------------------------------------------------*/
153
154#ifdef TEST_RIG
155
156#include <stdio.h>
157
158int main(void)
159{
160 unsigned long crc = 0;
161 char buf[BUFSIZ];
162 int r;
163
164 do {
165 r = fread(buf, 1, sizeof(buf), stdin);
166 if (r > 0)
167 crc = crc32(crc, buf, r);
168 } while (r == sizeof(buf));
169
170 printf("crc32(stdin) = %08lx\n", crc);
171 return (0);
172}
173
174#endif
175
176/*----- That's all, folks -------------------------------------------------*/