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