11debfc3dSmrg /* crc32.c
2*8feb0f0bSmrg Copyright (C) 2009-2020 Free Software Foundation, Inc.
31debfc3dSmrg
41debfc3dSmrg This file is part of the libiberty library.
51debfc3dSmrg
61debfc3dSmrg This file is free software; you can redistribute it and/or modify
71debfc3dSmrg it under the terms of the GNU General Public License as published by
81debfc3dSmrg the Free Software Foundation; either version 2 of the License, or
91debfc3dSmrg (at your option) any later version.
101debfc3dSmrg
111debfc3dSmrg In addition to the permissions in the GNU General Public License, the
121debfc3dSmrg Free Software Foundation gives you unlimited permission to link the
131debfc3dSmrg compiled version of this file into combinations with other programs,
141debfc3dSmrg and to distribute those combinations without any restriction coming
151debfc3dSmrg from the use of this file. (The General Public License restrictions
161debfc3dSmrg do apply in other respects; for example, they cover modification of
171debfc3dSmrg the file, and distribution when not linked into a combined
181debfc3dSmrg executable.)
191debfc3dSmrg
201debfc3dSmrg This program is distributed in the hope that it will be useful,
211debfc3dSmrg but WITHOUT ANY WARRANTY; without even the implied warranty of
221debfc3dSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
231debfc3dSmrg GNU General Public License for more details.
241debfc3dSmrg
251debfc3dSmrg You should have received a copy of the GNU General Public License
261debfc3dSmrg along with this program; if not, write to the Free Software
271debfc3dSmrg Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
281debfc3dSmrg */
291debfc3dSmrg
301debfc3dSmrg #ifdef HAVE_CONFIG_H
311debfc3dSmrg #include "config.h"
321debfc3dSmrg #endif
331debfc3dSmrg
341debfc3dSmrg #include "libiberty.h"
351debfc3dSmrg
361debfc3dSmrg /* This table was generated by the following program.
371debfc3dSmrg
381debfc3dSmrg #include <stdio.h>
391debfc3dSmrg
401debfc3dSmrg int
411debfc3dSmrg main ()
421debfc3dSmrg {
431debfc3dSmrg unsigned int i, j;
441debfc3dSmrg unsigned int c;
451debfc3dSmrg int table[256];
461debfc3dSmrg
471debfc3dSmrg for (i = 0; i < 256; i++)
481debfc3dSmrg {
491debfc3dSmrg for (c = i << 24, j = 8; j > 0; --j)
501debfc3dSmrg c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
511debfc3dSmrg table[i] = c;
521debfc3dSmrg }
531debfc3dSmrg
541debfc3dSmrg printf ("static const unsigned int crc32_table[] =\n{\n");
551debfc3dSmrg for (i = 0; i < 256; i += 4)
561debfc3dSmrg {
571debfc3dSmrg printf (" 0x%08x, 0x%08x, 0x%08x, 0x%08x",
581debfc3dSmrg table[i + 0], table[i + 1], table[i + 2], table[i + 3]);
591debfc3dSmrg if (i + 4 < 256)
601debfc3dSmrg putchar (',');
611debfc3dSmrg putchar ('\n');
621debfc3dSmrg }
631debfc3dSmrg printf ("};\n");
641debfc3dSmrg return 0;
651debfc3dSmrg }
661debfc3dSmrg
671debfc3dSmrg For more information on CRC, see, e.g.,
681debfc3dSmrg http://www.ross.net/crc/download/crc_v3.txt. */
691debfc3dSmrg
701debfc3dSmrg static const unsigned int crc32_table[] =
711debfc3dSmrg {
721debfc3dSmrg 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
731debfc3dSmrg 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
741debfc3dSmrg 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
751debfc3dSmrg 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
761debfc3dSmrg 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
771debfc3dSmrg 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
781debfc3dSmrg 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
791debfc3dSmrg 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
801debfc3dSmrg 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
811debfc3dSmrg 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
821debfc3dSmrg 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
831debfc3dSmrg 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
841debfc3dSmrg 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
851debfc3dSmrg 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
861debfc3dSmrg 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
871debfc3dSmrg 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
881debfc3dSmrg 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
891debfc3dSmrg 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
901debfc3dSmrg 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
911debfc3dSmrg 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
921debfc3dSmrg 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
931debfc3dSmrg 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
941debfc3dSmrg 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
951debfc3dSmrg 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
961debfc3dSmrg 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
971debfc3dSmrg 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
981debfc3dSmrg 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
991debfc3dSmrg 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
1001debfc3dSmrg 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
1011debfc3dSmrg 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
1021debfc3dSmrg 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
1031debfc3dSmrg 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
1041debfc3dSmrg 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
1051debfc3dSmrg 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
1061debfc3dSmrg 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
1071debfc3dSmrg 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
1081debfc3dSmrg 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
1091debfc3dSmrg 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
1101debfc3dSmrg 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
1111debfc3dSmrg 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
1121debfc3dSmrg 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
1131debfc3dSmrg 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
1141debfc3dSmrg 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
1151debfc3dSmrg 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
1161debfc3dSmrg 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
1171debfc3dSmrg 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
1181debfc3dSmrg 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
1191debfc3dSmrg 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
1201debfc3dSmrg 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
1211debfc3dSmrg 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
1221debfc3dSmrg 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
1231debfc3dSmrg 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
1241debfc3dSmrg 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
1251debfc3dSmrg 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
1261debfc3dSmrg 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
1271debfc3dSmrg 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
1281debfc3dSmrg 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
1291debfc3dSmrg 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
1301debfc3dSmrg 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
1311debfc3dSmrg 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
1321debfc3dSmrg 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
1331debfc3dSmrg 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
1341debfc3dSmrg 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
1351debfc3dSmrg 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
1361debfc3dSmrg };
1371debfc3dSmrg
1381debfc3dSmrg /*
1391debfc3dSmrg
1401debfc3dSmrg @deftypefn Extension {unsigned int} crc32 (const unsigned char *@var{buf}, @
1411debfc3dSmrg int @var{len}, unsigned int @var{init})
1421debfc3dSmrg
1431debfc3dSmrg Compute the 32-bit CRC of @var{buf} which has length @var{len}. The
1441debfc3dSmrg starting value is @var{init}; this may be used to compute the CRC of
1451debfc3dSmrg data split across multiple buffers by passing the return value of each
1461debfc3dSmrg call as the @var{init} parameter of the next.
1471debfc3dSmrg
1481debfc3dSmrg This is used by the @command{gdb} remote protocol for the @samp{qCRC}
1491debfc3dSmrg command. In order to get the same results as gdb for a block of data,
1501debfc3dSmrg you must pass the first CRC parameter as @code{0xffffffff}.
1511debfc3dSmrg
1521debfc3dSmrg This CRC can be specified as:
1531debfc3dSmrg
1541debfc3dSmrg Width : 32
1551debfc3dSmrg Poly : 0x04c11db7
1561debfc3dSmrg Init : parameter, typically 0xffffffff
1571debfc3dSmrg RefIn : false
1581debfc3dSmrg RefOut : false
1591debfc3dSmrg XorOut : 0
1601debfc3dSmrg
1611debfc3dSmrg This differs from the "standard" CRC-32 algorithm in that the values
1621debfc3dSmrg are not reflected, and there is no final XOR value. These differences
1631debfc3dSmrg make it easy to compose the values of multiple blocks.
1641debfc3dSmrg
1651debfc3dSmrg @end deftypefn
1661debfc3dSmrg
1671debfc3dSmrg */
1681debfc3dSmrg
1691debfc3dSmrg unsigned int
xcrc32(const unsigned char * buf,int len,unsigned int init)1701debfc3dSmrg xcrc32 (const unsigned char *buf, int len, unsigned int init)
1711debfc3dSmrg {
1721debfc3dSmrg unsigned int crc = init;
1731debfc3dSmrg while (len--)
1741debfc3dSmrg {
1751debfc3dSmrg crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
1761debfc3dSmrg buf++;
1771debfc3dSmrg }
1781debfc3dSmrg return crc;
1791debfc3dSmrg }
180