]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/lib/crc32.c
Apply Preben 'Peppe' Guldberg <peppe@wielders.org>
[bacula/bacula] / bacula / src / lib / crc32.c
1 /*
2  *  32 bit CRC.  Algorithm from RFC 2083 (png format)
3  *
4  *   By Kern Sibbald, January 2001
5  *
6  *   Version $Id$
7  *
8  */
9 /*
10    Copyright (C) 2001-2004 Kern Sibbald and John Walker
11
12    This library is free software; you can redistribute it and/or
13    modify it under the terms of the GNU Lesser General Public
14    License as published by the Free Software Foundation; either
15    version 2.1 of the License, or (at your option) any later version.
16
17    This library is distributed in the hope that it will be useful,
18    but WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20    Lesser General Public License for more details.
21
22    You should have received a copy of the GNU Lesser General Public
23    License along with this library; if not, write to the Free
24    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
25    MA 02111-1307, USA.
26
27  */
28
29 #ifdef GENERATE_STATIC_CRC_TABLE
30 /*
31  * The following code can be used to generate the static CRC table.
32  *
33  * Note, the magic number 0xedb88320L below comes from the terms
34  * of the defining polynomial x^n,
35  * where n=0,1,2,4,5,7,8,10,11,12,16,22,23,26
36  */
37 #include <stdio.h>
38
39 main()
40 {
41    unsigned long crc;
42    unsigned long buf[5];
43    int i, j, k;
44    k = 0;
45    for (i = 0; i < 256; i++) {
46       crc = (unsigned long)i;
47       for (j = 0; j < 8; j++) {
48          if (crc & 1) {
49             crc = 0xedb88320L ^ (crc >> 1);
50          } else {
51             crc = crc >> 1;
52          }
53       }
54       buf[k++] = crc;
55       if (k == 5) {
56          k = 0;
57          printf("  0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x,\n",
58             buf[0], buf[1], buf[2], buf[3], buf[4]);
59       }
60    }
61    printf("  0x%08x\n", buf[0]);
62 }
63 #endif
64
65 #include "bacula.h"
66
67 static uint32_t crc_table[256] = {
68   0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
69   0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
70   0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
71   0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
72   0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
73   0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
74   0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
75   0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
76   0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
77   0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
78   0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
79   0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
80   0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
81   0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
82   0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
83   0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
84   0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
85   0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
86   0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
87   0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
88   0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
89   0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
90   0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
91   0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
92   0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
93   0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
94   0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
95   0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
96   0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
97   0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
98   0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
99   0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
100   0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
101   0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
102   0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
103   0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
104   0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
105   0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
106   0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
107   0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
108   0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
109   0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
110   0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
111   0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
112   0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
113   0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
114   0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
115   0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
116   0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
117   0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
118   0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
119   0x2d02ef8d
120 };
121
122 /*
123  * Calculate the PNG 32 bit CRC on a buffer */
124 uint32_t bcrc32(uint8_t *buf, int len)
125 {
126   uint32_t crc = 0xFFFFFFFFL;
127   int i;
128
129   for (i=0; i < len; i++) {
130      crc = crc_table[(crc ^ buf[i]) & 0xFF] ^ (crc >> 8);
131   }
132   return crc ^ 0xFFFFFFFFL;
133 }