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