1 /*
2     This file is part of VK/KittenPHP-DB-Engine Library.
3 
4     VK/KittenPHP-DB-Engine Library is free software: you can redistribute it and/or modify
5     it under the terms of the GNU Lesser General Public License as published by
6     the Free Software Foundation, either version 2 of the License, or
7     (at your option) any later version.
8 
9     VK/KittenPHP-DB-Engine Library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU Lesser General Public License for more details.
13 
14     You should have received a copy of the GNU Lesser General Public License
15     along with VK/KittenPHP-DB-Engine Library.  If not, see <http://www.gnu.org/licenses/>.
16 
17     Copyright 2009-2012 Vkontakte Ltd
18               2009-2012 Nikolai Durov
19               2009-2012 Andrei Lopatin
20                    2012 Anton Maydell
21 */
22 
23 #include <stdlib.h>
24 #include <math.h>
25 #include <assert.h>
26 
27 #include "crc32.h"
28 
29 unsigned int crc32_table[256] =
30 {
31   0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
32   0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
33   0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
34   0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
35   0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
36   0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
37   0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
38   0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
39   0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
40   0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
41   0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
42   0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
43   0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
44   0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
45   0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
46   0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
47   0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
48   0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
49   0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
50   0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
51   0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
52   0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
53   0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
54   0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
55   0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
56   0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
57   0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
58   0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
59   0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
60   0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
61   0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
62   0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
63   0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
64   0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
65   0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
66   0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
67   0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
68   0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
69   0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
70   0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
71   0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
72   0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
73   0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
74   0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
75   0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
76   0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
77   0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
78   0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
79   0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
80   0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
81   0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
82   0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
83   0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
84   0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
85   0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
86   0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
87   0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
88   0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
89   0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
90   0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
91   0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
92   0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
93   0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
94   0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
95 };
96 
97 unsigned int crc32_table2[256] =
98 {
99   0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3,
100   0x646cc504, 0x7d77f445, 0x565aa786, 0x4f4196c7,
101   0xc8d98a08, 0xd1c2bb49, 0xfaefe88a, 0xe3f4d9cb,
102   0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, 0x87981ccf,
103   0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192,
104   0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496,
105   0x821b9859, 0x9b00a918, 0xb02dfadb, 0xa936cb9a,
106   0xe6775d5d, 0xff6c6c1c, 0xd4413fdf, 0xcd5a0e9e,
107   0x958424a2, 0x8c9f15e3, 0xa7b24620, 0xbea97761,
108   0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265,
109   0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69,
110   0x39316bae, 0x202a5aef, 0x0b07092c, 0x121c386d,
111   0xdf4636f3, 0xc65d07b2, 0xed705471, 0xf46b6530,
112   0xbb2af3f7, 0xa231c2b6, 0x891c9175, 0x9007a034,
113   0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38,
114   0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c,
115   0xf0794f05, 0xe9627e44, 0xc24f2d87, 0xdb541cc6,
116   0x94158a01, 0x8d0ebb40, 0xa623e883, 0xbf38d9c2,
117   0x38a0c50d, 0x21bbf44c, 0x0a96a78f, 0x138d96ce,
118   0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca,
119   0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97,
120   0xded79850, 0xc7cca911, 0xece1fad2, 0xf5facb93,
121   0x7262d75c, 0x6b79e61d, 0x4054b5de, 0x594f849f,
122   0x160e1258, 0x0f152319, 0x243870da, 0x3d23419b,
123   0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864,
124   0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60,
125   0xad24e1af, 0xb43fd0ee, 0x9f12832d, 0x8609b26c,
126   0xc94824ab, 0xd05315ea, 0xfb7e4629, 0xe2657768,
127   0x2f3f79f6, 0x362448b7, 0x1d091b74, 0x04122a35,
128   0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31,
129   0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d,
130   0x838a36fa, 0x9a9107bb, 0xb1bc5478, 0xa8a76539,
131   0x3b83984b, 0x2298a90a, 0x09b5fac9, 0x10aecb88,
132   0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, 0x74c20e8c,
133   0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180,
134   0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484,
135   0x71418a1a, 0x685abb5b, 0x4377e898, 0x5a6cd9d9,
136   0x152d4f1e, 0x0c367e5f, 0x271b2d9c, 0x3e001cdd,
137   0xb9980012, 0xa0833153, 0x8bae6290, 0x92b553d1,
138   0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5,
139   0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a,
140   0xca6b79ed, 0xd37048ac, 0xf85d1b6f, 0xe1462a2e,
141   0x66de36e1, 0x7fc507a0, 0x54e85463, 0x4df36522,
142   0x02b2f3e5, 0x1ba9c2a4, 0x30849167, 0x299fa026,
143   0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b,
144   0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f,
145   0x2c1c24b0, 0x350715f1, 0x1e2a4632, 0x07317773,
146   0x4870e1b4, 0x516bd0f5, 0x7a468336, 0x635db277,
147   0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, 0xe0d7848d,
148   0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189,
149   0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85,
150   0x674f9842, 0x7e54a903, 0x5579fac0, 0x4c62cb81,
151   0x8138c51f, 0x9823f45e, 0xb30ea79d, 0xaa1596dc,
152   0xe554001b, 0xfc4f315a, 0xd7626299, 0xce7953d8,
153   0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4,
154   0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0,
155   0x5e7ef3ec, 0x4765c2ad, 0x6c48916e, 0x7553a02f,
156   0x3a1236e8, 0x230907a9, 0x0824546a, 0x113f652b,
157   0x96a779e4, 0x8fbc48a5, 0xa4911b66, 0xbd8a2a27,
158   0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23,
159   0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e,
160   0x70d024b9, 0x69cb15f8, 0x42e6463b, 0x5bfd777a,
161   0xdc656bb5, 0xc57e5af4, 0xee530937, 0xf7483876,
162   0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, 0x9324fd72,
163 };
164 
165 unsigned int crc32_table1[256] =
166 {
167   0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59,
168   0x0709a8dc, 0x06cbc2eb, 0x048d7cb2, 0x054f1685,
169   0x0e1351b8, 0x0fd13b8f, 0x0d9785d6, 0x0c55efe1,
170   0x091af964, 0x08d89353, 0x0a9e2d0a, 0x0b5c473d,
171   0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29,
172   0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5,
173   0x1235f2c8, 0x13f798ff, 0x11b126a6, 0x10734c91,
174   0x153c5a14, 0x14fe3023, 0x16b88e7a, 0x177ae44d,
175   0x384d46e0, 0x398f2cd7, 0x3bc9928e, 0x3a0bf8b9,
176   0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065,
177   0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901,
178   0x3157bf84, 0x3095d5b3, 0x32d36bea, 0x331101dd,
179   0x246be590, 0x25a98fa7, 0x27ef31fe, 0x262d5bc9,
180   0x23624d4c, 0x22a0277b, 0x20e69922, 0x2124f315,
181   0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71,
182   0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad,
183   0x709a8dc0, 0x7158e7f7, 0x731e59ae, 0x72dc3399,
184   0x7793251c, 0x76514f2b, 0x7417f172, 0x75d59b45,
185   0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, 0x7ccf6221,
186   0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd,
187   0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9,
188   0x6bb5866c, 0x6a77ec5b, 0x68315202, 0x69f33835,
189   0x62af7f08, 0x636d153f, 0x612bab66, 0x60e9c151,
190   0x65a6d7d4, 0x6464bde3, 0x662203ba, 0x67e0698d,
191   0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579,
192   0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5,
193   0x46c49a98, 0x4706f0af, 0x45404ef6, 0x448224c1,
194   0x41cd3244, 0x400f5873, 0x4249e62a, 0x438b8c1d,
195   0x54f16850, 0x55330267, 0x5775bc3e, 0x56b7d609,
196   0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5,
197   0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1,
198   0x5deb9134, 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d,
199   0xe1351b80, 0xe0f771b7, 0xe2b1cfee, 0xe373a5d9,
200   0xe63cb35c, 0xe7fed96b, 0xe5b86732, 0xe47a0d05,
201   0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461,
202   0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd,
203   0xfd13b8f0, 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9,
204   0xfa1a102c, 0xfbd87a1b, 0xf99ec442, 0xf85cae75,
205   0xf300e948, 0xf2c2837f, 0xf0843d26, 0xf1465711,
206   0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd,
207   0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339,
208   0xde71f5bc, 0xdfb39f8b, 0xddf521d2, 0xdc374be5,
209   0xd76b0cd8, 0xd6a966ef, 0xd4efd8b6, 0xd52db281,
210   0xd062a404, 0xd1a0ce33, 0xd3e6706a, 0xd2241a5d,
211   0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049,
212   0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895,
213   0xcb4dafa8, 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1,
214   0xcc440774, 0xcd866d43, 0xcfc0d31a, 0xce02b92d,
215   0x91af9640, 0x906dfc77, 0x922b422e, 0x93e92819,
216   0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5,
217   0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1,
218   0x98b56f24, 0x99770513, 0x9b31bb4a, 0x9af3d17d,
219   0x8d893530, 0x8c4b5f07, 0x8e0de15e, 0x8fcf8b69,
220   0x8a809dec, 0x8b42f7db, 0x89044982, 0x88c623b5,
221   0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1,
222   0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d,
223   0xa9e2d0a0, 0xa820ba97, 0xaa6604ce, 0xaba46ef9,
224   0xaeeb787c, 0xaf29124b, 0xad6fac12, 0xacadc625,
225   0xa7f18118, 0xa633eb2f, 0xa4755576, 0xa5b73f41,
226   0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d,
227   0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89,
228   0xb2cddb0c, 0xb30fb13b, 0xb1490f62, 0xb08b6555,
229   0xbbd72268, 0xba15485f, 0xb853f606, 0xb9919c31,
230   0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, 0xbe9834ed,
231 };
232 
233 unsigned int crc32_table0[256] = {
234   0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee,
235   0x8f629757, 0x37def032, 0x256b5fdc, 0x9dd738b9,
236   0xc5b428ef, 0x7d084f8a, 0x6fbde064, 0xd7018701,
237   0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, 0x58631056,
238   0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871,
239   0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26,
240   0x95ad7f70, 0x2d111815, 0x3fa4b7fb, 0x8718d09e,
241   0x1acfe827, 0xa2738f42, 0xb0c620ac, 0x087a47c9,
242   0xa032af3e, 0x188ec85b, 0x0a3b67b5, 0xb28700d0,
243   0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787,
244   0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f,
245   0xeae41086, 0x525877e3, 0x40edd80d, 0xf851bf68,
246   0xf02bf8a1, 0x48979fc4, 0x5a22302a, 0xe29e574f,
247   0x7f496ff6, 0xc7f50893, 0xd540a77d, 0x6dfcc018,
248   0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0,
249   0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7,
250   0x9b14583d, 0x23a83f58, 0x311d90b6, 0x89a1f7d3,
251   0x1476cf6a, 0xaccaa80f, 0xbe7f07e1, 0x06c36084,
252   0x5ea070d2, 0xe61c17b7, 0xf4a9b859, 0x4c15df3c,
253   0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b,
254   0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c,
255   0x446f98f5, 0xfcd3ff90, 0xee66507e, 0x56da371b,
256   0x0eb9274d, 0xb6054028, 0xa4b0efc6, 0x1c0c88a3,
257   0x81dbb01a, 0x3967d77f, 0x2bd27891, 0x936e1ff4,
258   0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed,
259   0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba,
260   0xfe92dfec, 0x462eb889, 0x549b1767, 0xec277002,
261   0x71f048bb, 0xc94c2fde, 0xdbf98030, 0x6345e755,
262   0x6b3fa09c, 0xd383c7f9, 0xc1366817, 0x798a0f72,
263   0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825,
264   0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d,
265   0x21e91f24, 0x99557841, 0x8be0d7af, 0x335cb0ca,
266   0xed59b63b, 0x55e5d15e, 0x47507eb0, 0xffec19d5,
267   0x623b216c, 0xda874609, 0xc832e9e7, 0x708e8e82,
268   0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a,
269   0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d,
270   0xbd40e1a4, 0x05fc86c1, 0x1749292f, 0xaff54e4a,
271   0x322276f3, 0x8a9e1196, 0x982bbe78, 0x2097d91d,
272   0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, 0x6a4166a5,
273   0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2,
274   0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb,
275   0xc2098e52, 0x7ab5e937, 0x680046d9, 0xd0bc21bc,
276   0x88df31ea, 0x3063568f, 0x22d6f961, 0x9a6a9e04,
277   0x07bda6bd, 0xbf01c1d8, 0xadb46e36, 0x15080953,
278   0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174,
279   0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623,
280   0xd8c66675, 0x607a0110, 0x72cfaefe, 0xca73c99b,
281   0x57a4f122, 0xef189647, 0xfdad39a9, 0x45115ecc,
282   0x764dee06, 0xcef18963, 0xdc44268d, 0x64f841e8,
283   0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf,
284   0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907,
285   0x3c9b51be, 0x842736db, 0x96929935, 0x2e2efe50,
286   0x2654b999, 0x9ee8defc, 0x8c5d7112, 0x34e11677,
287   0xa9362ece, 0x118a49ab, 0x033fe645, 0xbb838120,
288   0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98,
289   0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf,
290   0xd67f4138, 0x6ec3265d, 0x7c7689b3, 0xc4caeed6,
291   0x591dd66f, 0xe1a1b10a, 0xf3141ee4, 0x4ba87981,
292   0x13cb69d7, 0xab770eb2, 0xb9c2a15c, 0x017ec639,
293   0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e,
294   0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949,
295   0x090481f0, 0xb1b8e695, 0xa30d497b, 0x1bb12e1e,
296   0x43d23e48, 0xfb6e592d, 0xe9dbf6c3, 0x516791a6,
297   0xccb0a91f, 0x740cce7a, 0x66b96194, 0xde0506f1,
298 };
299 
crc32_partial(const void * data,int len,unsigned crc)300 static unsigned int crc32_partial (const void *data, int len, unsigned crc) {
301   const int *p = (const int *) data;
302   int x;
303 #define DO_ONE(v) crc ^= v; crc = crc32_table0[crc & 0xff] ^ crc32_table1[(crc & 0xff00) >> 8] ^ crc32_table2[(crc & 0xff0000) >> 16] ^ crc32_table[crc >> 24];
304 #define DO_FOUR(p) DO_ONE((p)[0]); DO_ONE((p)[1]); DO_ONE((p)[2]); DO_ONE((p)[3]);
305 
306   for (x = (len >> 5); x > 0; x--) {
307     DO_FOUR (p);
308     DO_FOUR (p + 4);
309     p += 8;
310   }
311   if (len & 16) {
312     DO_FOUR (p);
313     p += 4;
314   }
315   if (len & 8) {
316     DO_ONE (p[0]);
317     DO_ONE (p[1]);
318     p += 2;
319   }
320   if (len & 4) {
321     DO_ONE (*p++);
322   }
323   /*
324   for (x = (len >> 2) & 7; x > 0; x--) {
325     DO_ONE (*p++);
326   }
327   */
328 #undef DO_ONE
329 #undef DO_FOUR
330   const char *q = (const char *) p;
331   if (len & 2) {
332     crc = crc32_table[(crc ^ q[0]) & 0xff] ^ (crc >> 8);
333     crc = crc32_table[(crc ^ q[1]) & 0xff] ^ (crc >> 8);
334     q += 2;
335   }
336   if (len & 1) {
337     crc = crc32_table[(crc ^ *q++) & 0xff] ^ (crc >> 8);
338   }
339   return crc;
340 }
341 
compute_crc32(const void * data,int len)342 unsigned int compute_crc32 (const void *data, int len) {
343   return crc32_partial (data, len, -1) ^ -1;
344 }
345 
346