chiark / gitweb /
New addition: bit manipulation macros.
[mLib] / crc32.c
1 /* -*-c-*-
2  *
3  * $Id: crc32.c,v 1.3 1999/05/06 19:51:35 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.3  1999/05/06 19:51:35  mdw
34  * Reformatted the LGPL notice a little bit.
35  *
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
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
71 unsigned 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
152 unsigned 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
165 int 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 -------------------------------------------------*/