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