Yet Another eXchange Tool 0.11.4
Loading...
Searching...
No Matches
cksum.c
Go to the documentation of this file.
1
11/*
12 * Maintainer: Jörg Behrens <behrens@dkrz.de>
13 * Moritz Hanke <hanke@dkrz.de>
14 * Thomas Jahns <jahns@dkrz.de>
15 * URL: https://dkrz-sw.gitlab-pages.dkrz.de/yaxt/
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions are
19 * met:
20 *
21 * Redistributions of source code must retain the above copyright notice,
22 * this list of conditions and the following disclaimer.
23 *
24 * Redistributions in binary form must reproduce the above copyright
25 * notice, this list of conditions and the following disclaimer in the
26 * documentation and/or other materials provided with the distribution.
27 *
28 * Neither the name of the DKRZ GmbH nor the names of its contributors
29 * may be used to endorse or promote products derived from this software
30 * without specific prior written permission.
31 *
32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
33 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
34 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
35 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
36 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
37 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
38 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
39 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
40 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
41 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
42 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43 */
44
45#ifdef HAVE_CONFIG_H
46# include "config.h"
47#endif
48
49#include <inttypes.h>
50#include <stdlib.h>
51#include <sys/types.h>
52#ifdef WORDS_BIGENDIAN
53#include <limits.h>
54#endif
55
56#include "cksum.h"
57
58static const uint32_t crctab[] = {
59 0x00000000,
60 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
61 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6,
62 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
63 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac,
64 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f,
65 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a,
66 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
67 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58,
68 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033,
69 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe,
70 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
71 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4,
72 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
73 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5,
74 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
75 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07,
76 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c,
77 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1,
78 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
79 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b,
80 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698,
81 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d,
82 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
83 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f,
84 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
85 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80,
86 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
87 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a,
88 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629,
89 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c,
90 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
91 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e,
92 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65,
93 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8,
94 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
95 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2,
96 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
97 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74,
98 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
99 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21,
100 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a,
101 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087,
102 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
103 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d,
104 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce,
105 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb,
106 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
107 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09,
108 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
109 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf,
110 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
111};
112
113
114uint32_t
115SymPrefix(memcrc)(const unsigned char *b, size_t n)
116{
117/* Input arguments:
118 * const char* b == byte sequence to checksum
119 * size_t n == length of sequence
120 */
121
122
123 uint32_t s = 0;
124
125 SymPrefix(memcrc_r)(&s, b, n);
126
127 /* Extend with the length of the string. */
128 while (n != 0) {
129 register uint32_t c = n & 0377;
130 n >>= 8;
131 s = (s << 8) ^ crctab[(s >> 24) ^ c];
132 }
133
134
135 return ~s;
136}
137
138void
139SymPrefix(memcrc_r)(uint32_t *state, const unsigned char *block, size_t block_len)
140{
141/* Input arguments:
142 * const char* b == byte sequence to checksum
143 * size_t n == length of sequence
144 */
145
146
147 register uint32_t c, s = *state;
148 register size_t n = block_len;
149 register const unsigned char *b = block;
150
151 for (; n > 0; --n) {
152 c = (uint32_t)(*b++);
153 s = (s << 8) ^ crctab[(s >> 24) ^ c];
154 }
155
156 *state = s;
157}
158
159#ifdef WORDS_BIGENDIAN
160#define SWAP_CSUM(BITWIDTH,BYTEWIDTH,NACC) \
161 do { \
162 register const uint##BITWIDTH##_t *b = (uint##BITWIDTH##_t *)elems; \
163 for (size_t i = 0; i < num_elems; ++i) { \
164 for(size_t aofs = NACC; aofs > 0; --aofs) { \
165 uint##BITWIDTH##_t accum = b[i + aofs - 1]; \
166 for (size_t j = 0; j < BYTEWIDTH; ++j) { \
167 uint32_t c = (uint32_t)(accum & UCHAR_MAX); \
168 s = (s << 8) ^ crctab[(s >> 24) ^ c]; \
169 accum >>= 8; \
170 } \
171 } \
172 } \
173 } while (0)
174#endif
175
176
186void
187SymPrefix(memcrc_r_eswap)(uint32_t *state, const unsigned char *elems, size_t num_elems,
188 size_t elem_size)
189{
190#ifdef WORDS_BIGENDIAN
191 register uint32_t s = *state;
192
193 switch (elem_size)
194 {
195 case 1:
196 SymPrefix(memcrc_r)(state, elems, num_elems * elem_size);
197 return;
198 case 2:
199 SWAP_CSUM(16,2,1);
200 break;
201 case 4:
202 SWAP_CSUM(32,4,1);
203 break;
204 case 8:
205 SWAP_CSUM(64,8,1);
206 break;
207 case 16:
208 SWAP_CSUM(64,8,2);
209 break;
210 }
211 *state = s;
212#else
213 SymPrefix(memcrc_r)(state, elems, num_elems * elem_size);
214#endif
215}
216
217
218uint32_t
219SymPrefix(memcrc_finish)(uint32_t *state, off_t total_size)
220{
221 register uint32_t c, s = *state;
222 register uint64_t n = (uint64_t)total_size;
223
224 /* Extend with the length of the string. */
225 while (n != 0) {
226 c = n & 0377;
227 n >>= 8;
228 s = (s << 8) ^ crctab[(s >> 24) ^ c];
229 }
230
231 return ~s;
232}
233
234/*
235 * Local Variables:
236 * coding: utf-8
237 * c-file-style: "Java"
238 * c-basic-offset: 2
239 * indent-tabs-mode: nil
240 * show-trailing-whitespace: t
241 * require-trailing-newline: t
242 * license-project-url: "https://dkrz-sw.gitlab-pages.dkrz.de/yaxt/"
243 * license-default: "bsd"
244 * End:
245 */
uint32_t SymPrefix memcrc_finish(uint32_t *state, off_t total_size)
Definition cksum.c:219
static const uint32_t crctab[]
Definition cksum.c:58
uint32_t SymPrefix memcrc(const unsigned char *b, size_t n)
Definition cksum.c:115
void SymPrefix memcrc_r_eswap(uint32_t *state, const unsigned char *elems, size_t num_elems, size_t elem_size)
Definition cksum.c:187
void SymPrefix memcrc_r(uint32_t *state, const unsigned char *block, size_t block_len)
Definition cksum.c:139
#define SymPrefix(symbol)
Definition symprefix.h:53