xref: /netbsd-src/external/gpl3/gcc.old/dist/libiberty/crc32.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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