chiark / gitweb /
*** empty log message ***
[mLib] / crc32.c
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
64 unsigned 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
145 unsigned 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
158 int 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 -------------------------------------------------*/