xref: /netbsd-src/external/gpl3/gcc/dist/libiberty/crc32.c (revision b1e838363e3c6fc78a55519254d99869742dd33c)
14fee23f9Smrg /* crc32.c
2*b1e83836Smrg    Copyright (C) 2009-2022 Free Software Foundation, Inc.
34fee23f9Smrg 
44fee23f9Smrg    This file is part of the libiberty library.
54fee23f9Smrg 
64fee23f9Smrg    This file is free software; you can redistribute it and/or modify
74fee23f9Smrg    it under the terms of the GNU General Public License as published by
84fee23f9Smrg    the Free Software Foundation; either version 2 of the License, or
94fee23f9Smrg    (at your option) any later version.
104fee23f9Smrg 
114fee23f9Smrg    In addition to the permissions in the GNU General Public License, the
124fee23f9Smrg    Free Software Foundation gives you unlimited permission to link the
134fee23f9Smrg    compiled version of this file into combinations with other programs,
144fee23f9Smrg    and to distribute those combinations without any restriction coming
154fee23f9Smrg    from the use of this file.  (The General Public License restrictions
164fee23f9Smrg    do apply in other respects; for example, they cover modification of
174fee23f9Smrg    the file, and distribution when not linked into a combined
184fee23f9Smrg    executable.)
194fee23f9Smrg 
204fee23f9Smrg    This program is distributed in the hope that it will be useful,
214fee23f9Smrg    but WITHOUT ANY WARRANTY; without even the implied warranty of
224fee23f9Smrg    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
234fee23f9Smrg    GNU General Public License for more details.
244fee23f9Smrg 
254fee23f9Smrg    You should have received a copy of the GNU General Public License
264fee23f9Smrg    along with this program; if not, write to the Free Software
274fee23f9Smrg    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
284fee23f9Smrg */
294fee23f9Smrg 
304fee23f9Smrg #ifdef HAVE_CONFIG_H
314fee23f9Smrg #include "config.h"
324fee23f9Smrg #endif
334fee23f9Smrg 
344fee23f9Smrg #include "libiberty.h"
354fee23f9Smrg 
36f9a78e0eSmrg /* This table was generated by the following program.
374fee23f9Smrg 
384fee23f9Smrg    #include <stdio.h>
394fee23f9Smrg 
404fee23f9Smrg    int
414fee23f9Smrg    main ()
424fee23f9Smrg    {
43f9a78e0eSmrg      unsigned int i, j;
444fee23f9Smrg      unsigned int c;
454fee23f9Smrg      int table[256];
464fee23f9Smrg 
474fee23f9Smrg      for (i = 0; i < 256; i++)
484fee23f9Smrg        {
494fee23f9Smrg 	 for (c = i << 24, j = 8; j > 0; --j)
504fee23f9Smrg 	   c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
514fee23f9Smrg 	 table[i] = c;
524fee23f9Smrg        }
534fee23f9Smrg 
544fee23f9Smrg      printf ("static const unsigned int crc32_table[] =\n{\n");
554fee23f9Smrg      for (i = 0; i < 256; i += 4)
564fee23f9Smrg        {
574fee23f9Smrg 	 printf ("  0x%08x, 0x%08x, 0x%08x, 0x%08x",
584fee23f9Smrg 		 table[i + 0], table[i + 1], table[i + 2], table[i + 3]);
594fee23f9Smrg 	 if (i + 4 < 256)
604fee23f9Smrg 	   putchar (',');
614fee23f9Smrg 	 putchar ('\n');
624fee23f9Smrg        }
634fee23f9Smrg      printf ("};\n");
644fee23f9Smrg      return 0;
654fee23f9Smrg    }
664fee23f9Smrg 
674fee23f9Smrg    For more information on CRC, see, e.g.,
684fee23f9Smrg    http://www.ross.net/crc/download/crc_v3.txt.  */
694fee23f9Smrg 
704fee23f9Smrg static const unsigned int crc32_table[] =
714fee23f9Smrg {
724fee23f9Smrg   0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
734fee23f9Smrg   0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
744fee23f9Smrg   0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
754fee23f9Smrg   0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
764fee23f9Smrg   0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
774fee23f9Smrg   0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
784fee23f9Smrg   0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
794fee23f9Smrg   0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
804fee23f9Smrg   0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
814fee23f9Smrg   0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
824fee23f9Smrg   0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
834fee23f9Smrg   0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
844fee23f9Smrg   0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
854fee23f9Smrg   0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
864fee23f9Smrg   0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
874fee23f9Smrg   0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
884fee23f9Smrg   0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
894fee23f9Smrg   0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
904fee23f9Smrg   0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
914fee23f9Smrg   0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
924fee23f9Smrg   0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
934fee23f9Smrg   0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
944fee23f9Smrg   0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
954fee23f9Smrg   0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
964fee23f9Smrg   0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
974fee23f9Smrg   0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
984fee23f9Smrg   0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
994fee23f9Smrg   0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
1004fee23f9Smrg   0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
1014fee23f9Smrg   0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
1024fee23f9Smrg   0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
1034fee23f9Smrg   0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
1044fee23f9Smrg   0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
1054fee23f9Smrg   0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
1064fee23f9Smrg   0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
1074fee23f9Smrg   0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
1084fee23f9Smrg   0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
1094fee23f9Smrg   0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
1104fee23f9Smrg   0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
1114fee23f9Smrg   0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
1124fee23f9Smrg   0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
1134fee23f9Smrg   0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
1144fee23f9Smrg   0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
1154fee23f9Smrg   0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
1164fee23f9Smrg   0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
1174fee23f9Smrg   0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
1184fee23f9Smrg   0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
1194fee23f9Smrg   0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
1204fee23f9Smrg   0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
1214fee23f9Smrg   0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
1224fee23f9Smrg   0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
1234fee23f9Smrg   0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
1244fee23f9Smrg   0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
1254fee23f9Smrg   0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
1264fee23f9Smrg   0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
1274fee23f9Smrg   0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
1284fee23f9Smrg   0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
1294fee23f9Smrg   0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
1304fee23f9Smrg   0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
1314fee23f9Smrg   0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
1324fee23f9Smrg   0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
1334fee23f9Smrg   0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
1344fee23f9Smrg   0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
1354fee23f9Smrg   0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
1364fee23f9Smrg };
1374fee23f9Smrg 
1384fee23f9Smrg /*
1394fee23f9Smrg 
14048fb7bfaSmrg @deftypefn Extension {unsigned int} crc32 (const unsigned char *@var{buf}, @
14148fb7bfaSmrg   int @var{len}, unsigned int @var{init})
1424fee23f9Smrg 
1434fee23f9Smrg Compute the 32-bit CRC of @var{buf} which has length @var{len}.  The
1444fee23f9Smrg starting value is @var{init}; this may be used to compute the CRC of
1454fee23f9Smrg data split across multiple buffers by passing the return value of each
1464fee23f9Smrg call as the @var{init} parameter of the next.
1474fee23f9Smrg 
148f9a78e0eSmrg This is used by the @command{gdb} remote protocol for the @samp{qCRC}
149f9a78e0eSmrg command.  In order to get the same results as gdb for a block of data,
150f9a78e0eSmrg you must pass the first CRC parameter as @code{0xffffffff}.
1514fee23f9Smrg 
1524fee23f9Smrg This CRC can be specified as:
1534fee23f9Smrg 
1544fee23f9Smrg   Width  : 32
1554fee23f9Smrg   Poly   : 0x04c11db7
1564fee23f9Smrg   Init   : parameter, typically 0xffffffff
1574fee23f9Smrg   RefIn  : false
1584fee23f9Smrg   RefOut : false
1594fee23f9Smrg   XorOut : 0
1604fee23f9Smrg 
1614fee23f9Smrg This differs from the "standard" CRC-32 algorithm in that the values
1624fee23f9Smrg are not reflected, and there is no final XOR value.  These differences
1634fee23f9Smrg make it easy to compose the values of multiple blocks.
1644fee23f9Smrg 
1654fee23f9Smrg @end deftypefn
1664fee23f9Smrg 
1674fee23f9Smrg */
1684fee23f9Smrg 
1694fee23f9Smrg unsigned int
xcrc32(const unsigned char * buf,int len,unsigned int init)1704fee23f9Smrg xcrc32 (const unsigned char *buf, int len, unsigned int init)
1714fee23f9Smrg {
1724fee23f9Smrg   unsigned int crc = init;
1734fee23f9Smrg   while (len--)
1744fee23f9Smrg     {
1754fee23f9Smrg       crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
1764fee23f9Smrg       buf++;
1774fee23f9Smrg     }
1784fee23f9Smrg   return crc;
1794fee23f9Smrg }
180