2010-08-04 Tristan Gingold <gingold@adacore.com>
[binutils.git] / libiberty / crc32.c
blobc12916b5216a469d1b6a14e997aa72974783826f
1 /* crc32.c
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
18 executable.)
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.
30 #ifdef HAVE_CONFIG_H
31 #include "config.h"
32 #endif
34 #include "libiberty.h"
36 /* This table was generated by the following program. This matches
37 what gdb does.
39 #include <stdio.h>
41 int
42 main ()
44 int i, j;
45 unsigned int c;
46 int table[256];
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);
52 table[i] = c;
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]);
60 if (i + 4 < 256)
61 putchar (',');
62 putchar ('\n');
64 printf ("};\n");
65 return 0;
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:
155 Width : 32
156 Poly : 0x04c11db7
157 Init : parameter, typically 0xffffffff
158 RefIn : false
159 RefOut : false
160 XorOut : 0
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.
166 @end deftypefn
170 unsigned int
171 xcrc32 (const unsigned char *buf, int len, unsigned int init)
173 unsigned int crc = init;
174 while (len--)
176 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
177 buf++;
179 return crc;