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