chiark / gitweb /
Document DSTR_INIT.
[mLib] / crc32.c
CommitLineData
0875b58f 1/* -*-c-*-
2 *
7b4b46a7 3 * $Id: crc32.c,v 1.4 1999/06/01 09:47:22 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 $
7b4b46a7 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 *
0bd98442 36 * Revision 1.3 1999/05/06 19:51:35 mdw
37 * Reformatted the LGPL notice a little bit.
38 *
c846879c 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
0875b58f 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
7b4b46a7 57#include "bits.h"
0875b58f 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
7b4b46a7 75uint32 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,
0875b58f 140};
141
142/*----- Functionc provided ------------------------------------------------*/
143
144/* --- @crc32@ --- *
145 *
7b4b46a7 146 * Arguments: @uint32 crc@ = carryover from previous call, or zero
0875b58f 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
7b4b46a7 156uint32 crc32(uint32 crc, const void *buf, size_t sz)
0875b58f 157{
7b4b46a7 158 uint32 c;
0875b58f 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
169int main(void)
170{
7b4b46a7 171 uint32 crc = 0;
0875b58f 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
7b4b46a7 181 printf("crc32(stdin) = %08lx\n", (unsigned long)crc);
0875b58f 182 return (0);
183}
184
185#endif
186
187/*----- That's all, folks -------------------------------------------------*/