chiark / gitweb /
Version bump.
[mLib] / crc32.c
1 /* -*-c-*-
2  *
3  * $Id: crc32.c,v 1.4 1999/06/01 09:47:22 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 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  * 
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 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
26  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
27  * MA 02111-1307, USA.
28  */
29
30 /*----- Revision history --------------------------------------------------*
31  *
32  * $Log: crc32.c,v $
33  * Revision 1.4  1999/06/01 09:47:22  mdw
34  * Make the return type of `crc32' a `uint32' now that we have `bits.h'.
35  *
36  * Revision 1.3  1999/05/06 19:51:35  mdw
37  * Reformatted the LGPL notice a little bit.
38  *
39  * Revision 1.2  1999/05/05 18:50:31  mdw
40  * Change licensing conditions to LGPL.
41  *
42  * Revision 1.1.1.1  1998/06/17 23:44:42  mdw
43  * Initial version of mLib
44  *
45  */
46
47 /*----- Header files ------------------------------------------------------*/
48
49 /* --- ANSI headers --- */
50
51 #include <stdio.h>
52 #include <stdlib.h>
53 #include <string.h>
54
55 /* --- Local headers --- */
56
57 #include "bits.h"
58 #include "crc32.h"
59
60 /*----- CRC table ---------------------------------------------------------*/
61
62 /* --- Acknowledgements and information --- *
63  *
64  * This table was generated using a derivative of the Rocksoft Model CRC
65  * generator.  The parameters given are:
66  *
67  *   width = 32bits
68  *   poly = 0x04C11DB7
69  *   init = -1
70  *   xorout = -1
71  *   reverse = yes
72  *   check = crc(123456789) = 0xCBF43926
73  */
74
75 uint32 crc32_table[256] = {
76   0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
77   0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
78   0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
79   0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
80   0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
81   0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
82   0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
83   0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
84   0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
85   0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
86   0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
87   0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
88   0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
89   0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
90   0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
91   0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
92   0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
93   0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
94   0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
95   0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
96   0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
97   0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
98   0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
99   0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
100   0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
101   0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
102   0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
103   0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
104   0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
105   0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
106   0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
107   0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
108   0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
109   0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
110   0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
111   0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
112   0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
113   0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
114   0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
115   0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
116   0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
117   0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
118   0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
119   0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
120   0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
121   0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
122   0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
123   0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
124   0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
125   0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
126   0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
127   0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
128   0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
129   0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
130   0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
131   0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
132   0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
133   0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
134   0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
135   0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
136   0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
137   0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
138   0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
139   0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
140 };
141
142 /*----- Functionc provided ------------------------------------------------*/
143
144 /* --- @crc32@ --- *
145  *
146  * Arguments:   @uint32 crc@ = carryover from previous call, or zero
147  *              @const void *buf@ = pointer to buffer to check
148  *              @size_t sz@ = size of the buffer
149  *
150  * Returns:     The CRC updated by the new buffer.
151  *
152  * Use:         A restartable CRC calculator.  This is just a function
153  *              wrapper for the macro version.
154  */
155
156 uint32 crc32(uint32 crc, const void *buf, size_t sz)
157 {
158   uint32 c;
159   CRC32(c, crc, buf, sz);
160   return (c);
161 }
162
163 /*----- Test driver -------------------------------------------------------*/
164
165 #ifdef TEST_RIG
166
167 #include <stdio.h>
168
169 int main(void)
170 {
171   uint32 crc = 0;
172   char buf[BUFSIZ];
173   int r;
174
175   do {
176     r = fread(buf, 1, sizeof(buf), stdin);
177     if (r > 0)
178       crc = crc32(crc, buf, r);
179   } while (r == sizeof(buf));
180
181   printf("crc32(stdin) = %08lx\n", (unsigned long)crc);
182   return (0);
183 }
184
185 #endif
186
187 /*----- That's all, folks -------------------------------------------------*/