2
Copyright (C) 2009 Free Software Foundation, Inc.
4
This file is part of the libiberty library.
6
This file is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
11
In addition to the permissions in the GNU General Public License, the
12
Free Software Foundation gives you unlimited permission to link the
13
compiled version of this file into combinations with other programs,
14
and to distribute those combinations without any restriction coming
15
from the use of this file. (The General Public License restrictions
16
do apply in other respects; for example, they cover modification of
17
the file, and distribution when not linked into a combined
20
This program is distributed in the hope that it will be useful,
21
but WITHOUT ANY WARRANTY; without even the implied warranty of
22
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23
GNU General Public License for more details.
25
You should have received a copy of the GNU General Public License
26
along with this program; if not, write to the Free Software
27
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
34
#include "libiberty.h"
36
/* This table was generated by the following program. This matches
48
for (i = 0; i < 256; i++)
50
for (c = i << 24, j = 8; j > 0; --j)
51
c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
55
printf ("static const unsigned int crc32_table[] =\n{\n");
56
for (i = 0; i < 256; i += 4)
58
printf (" 0x%08x, 0x%08x, 0x%08x, 0x%08x",
59
table[i + 0], table[i + 1], table[i + 2], table[i + 3]);
68
For more information on CRC, see, e.g.,
69
http://www.ross.net/crc/download/crc_v3.txt. */
71
static const unsigned int crc32_table[] =
73
0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
74
0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
75
0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
76
0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
77
0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
78
0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
79
0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
80
0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
81
0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
82
0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
83
0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
84
0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
85
0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
86
0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
87
0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
88
0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
89
0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
90
0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
91
0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
92
0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
93
0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
94
0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
95
0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
96
0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
97
0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
98
0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
99
0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
100
0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
101
0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
102
0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
103
0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
104
0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
105
0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
106
0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
107
0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
108
0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
109
0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
110
0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
111
0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
112
0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
113
0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
114
0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
115
0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
116
0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
117
0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
118
0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
119
0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
120
0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
121
0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
122
0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
123
0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
124
0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
125
0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
126
0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
127
0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
128
0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
129
0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
130
0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
131
0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
132
0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
133
0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
134
0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
135
0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
136
0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
141
@deftypefn Extension unsigned int crc32 (const unsigned char *@var{buf}, int @var{len}, unsigned int @var{init})
143
Compute the 32-bit CRC of @var{buf} which has length @var{len}. The
144
starting value is @var{init}; this may be used to compute the CRC of
145
data split across multiple buffers by passing the return value of each
146
call as the @var{init} parameter of the next.
148
This is intended to match the CRC used by the @command{gdb} remote
149
protocol for the @samp{qCRC} command. In order to get the same
150
results as gdb for a block of data, you must pass the first CRC
151
parameter as @code{0xffffffff}.
153
This CRC can be specified as:
157
Init : parameter, typically 0xffffffff
162
This differs from the "standard" CRC-32 algorithm in that the values
163
are not reflected, and there is no final XOR value. These differences
164
make it easy to compose the values of multiple blocks.
171
xcrc32 (const unsigned char *buf, int len, unsigned int init)
173
unsigned int crc = init;
176
crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];