xref: /netbsd-src/external/gpl3/binutils.old/dist/libiberty/crc32.c (revision e992f068c547fd6e84b3f104dc2340adcc955732)
116dce513Schristos /* crc32.c
2*e992f068Schristos    Copyright (C) 2009-2022 Free Software Foundation, Inc.
316dce513Schristos 
416dce513Schristos    This file is part of the libiberty library.
516dce513Schristos 
616dce513Schristos    This file is free software; you can redistribute it and/or modify
716dce513Schristos    it under the terms of the GNU General Public License as published by
816dce513Schristos    the Free Software Foundation; either version 2 of the License, or
916dce513Schristos    (at your option) any later version.
1016dce513Schristos 
1116dce513Schristos    In addition to the permissions in the GNU General Public License, the
1216dce513Schristos    Free Software Foundation gives you unlimited permission to link the
1316dce513Schristos    compiled version of this file into combinations with other programs,
1416dce513Schristos    and to distribute those combinations without any restriction coming
1516dce513Schristos    from the use of this file.  (The General Public License restrictions
1616dce513Schristos    do apply in other respects; for example, they cover modification of
1716dce513Schristos    the file, and distribution when not linked into a combined
1816dce513Schristos    executable.)
1916dce513Schristos 
2016dce513Schristos    This program is distributed in the hope that it will be useful,
2116dce513Schristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
2216dce513Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2316dce513Schristos    GNU General Public License for more details.
2416dce513Schristos 
2516dce513Schristos    You should have received a copy of the GNU General Public License
2616dce513Schristos    along with this program; if not, write to the Free Software
2716dce513Schristos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
2816dce513Schristos */
2916dce513Schristos 
3016dce513Schristos #ifdef HAVE_CONFIG_H
3116dce513Schristos #include "config.h"
3216dce513Schristos #endif
3316dce513Schristos 
3416dce513Schristos #include "libiberty.h"
3516dce513Schristos 
3616dce513Schristos /* This table was generated by the following program.
3716dce513Schristos 
3816dce513Schristos    #include <stdio.h>
3916dce513Schristos 
4016dce513Schristos    int
4116dce513Schristos    main ()
4216dce513Schristos    {
4316dce513Schristos      unsigned int i, j;
4416dce513Schristos      unsigned int c;
4516dce513Schristos      int table[256];
4616dce513Schristos 
4716dce513Schristos      for (i = 0; i < 256; i++)
4816dce513Schristos        {
4916dce513Schristos 	 for (c = i << 24, j = 8; j > 0; --j)
5016dce513Schristos 	   c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
5116dce513Schristos 	 table[i] = c;
5216dce513Schristos        }
5316dce513Schristos 
5416dce513Schristos      printf ("static const unsigned int crc32_table[] =\n{\n");
5516dce513Schristos      for (i = 0; i < 256; i += 4)
5616dce513Schristos        {
5716dce513Schristos 	 printf ("  0x%08x, 0x%08x, 0x%08x, 0x%08x",
5816dce513Schristos 		 table[i + 0], table[i + 1], table[i + 2], table[i + 3]);
5916dce513Schristos 	 if (i + 4 < 256)
6016dce513Schristos 	   putchar (',');
6116dce513Schristos 	 putchar ('\n');
6216dce513Schristos        }
6316dce513Schristos      printf ("};\n");
6416dce513Schristos      return 0;
6516dce513Schristos    }
6616dce513Schristos 
6716dce513Schristos    For more information on CRC, see, e.g.,
6816dce513Schristos    http://www.ross.net/crc/download/crc_v3.txt.  */
6916dce513Schristos 
7016dce513Schristos static const unsigned int crc32_table[] =
7116dce513Schristos {
7216dce513Schristos   0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
7316dce513Schristos   0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
7416dce513Schristos   0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
7516dce513Schristos   0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
7616dce513Schristos   0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
7716dce513Schristos   0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
7816dce513Schristos   0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
7916dce513Schristos   0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
8016dce513Schristos   0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
8116dce513Schristos   0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
8216dce513Schristos   0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
8316dce513Schristos   0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
8416dce513Schristos   0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
8516dce513Schristos   0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
8616dce513Schristos   0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
8716dce513Schristos   0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
8816dce513Schristos   0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
8916dce513Schristos   0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
9016dce513Schristos   0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
9116dce513Schristos   0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
9216dce513Schristos   0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
9316dce513Schristos   0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
9416dce513Schristos   0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
9516dce513Schristos   0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
9616dce513Schristos   0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
9716dce513Schristos   0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
9816dce513Schristos   0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
9916dce513Schristos   0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
10016dce513Schristos   0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
10116dce513Schristos   0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
10216dce513Schristos   0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
10316dce513Schristos   0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
10416dce513Schristos   0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
10516dce513Schristos   0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
10616dce513Schristos   0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
10716dce513Schristos   0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
10816dce513Schristos   0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
10916dce513Schristos   0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
11016dce513Schristos   0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
11116dce513Schristos   0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
11216dce513Schristos   0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
11316dce513Schristos   0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
11416dce513Schristos   0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
11516dce513Schristos   0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
11616dce513Schristos   0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
11716dce513Schristos   0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
11816dce513Schristos   0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
11916dce513Schristos   0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
12016dce513Schristos   0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
12116dce513Schristos   0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
12216dce513Schristos   0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
12316dce513Schristos   0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
12416dce513Schristos   0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
12516dce513Schristos   0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
12616dce513Schristos   0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
12716dce513Schristos   0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
12816dce513Schristos   0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
12916dce513Schristos   0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
13016dce513Schristos   0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
13116dce513Schristos   0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
13216dce513Schristos   0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
13316dce513Schristos   0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
13416dce513Schristos   0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
13516dce513Schristos   0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
13616dce513Schristos };
13716dce513Schristos 
13816dce513Schristos /*
13916dce513Schristos 
14016dce513Schristos @deftypefn Extension {unsigned int} crc32 (const unsigned char *@var{buf}, @
14116dce513Schristos   int @var{len}, unsigned int @var{init})
14216dce513Schristos 
14316dce513Schristos Compute the 32-bit CRC of @var{buf} which has length @var{len}.  The
14416dce513Schristos starting value is @var{init}; this may be used to compute the CRC of
14516dce513Schristos data split across multiple buffers by passing the return value of each
14616dce513Schristos call as the @var{init} parameter of the next.
14716dce513Schristos 
14816dce513Schristos This is used by the @command{gdb} remote protocol for the @samp{qCRC}
14916dce513Schristos command.  In order to get the same results as gdb for a block of data,
15016dce513Schristos you must pass the first CRC parameter as @code{0xffffffff}.
15116dce513Schristos 
15216dce513Schristos This CRC can be specified as:
15316dce513Schristos 
15416dce513Schristos   Width  : 32
15516dce513Schristos   Poly   : 0x04c11db7
15616dce513Schristos   Init   : parameter, typically 0xffffffff
15716dce513Schristos   RefIn  : false
15816dce513Schristos   RefOut : false
15916dce513Schristos   XorOut : 0
16016dce513Schristos 
16116dce513Schristos This differs from the "standard" CRC-32 algorithm in that the values
16216dce513Schristos are not reflected, and there is no final XOR value.  These differences
16316dce513Schristos make it easy to compose the values of multiple blocks.
16416dce513Schristos 
16516dce513Schristos @end deftypefn
16616dce513Schristos 
16716dce513Schristos */
16816dce513Schristos 
16916dce513Schristos unsigned int
xcrc32(const unsigned char * buf,int len,unsigned int init)17016dce513Schristos xcrc32 (const unsigned char *buf, int len, unsigned int init)
17116dce513Schristos {
17216dce513Schristos   unsigned int crc = init;
17316dce513Schristos   while (len--)
17416dce513Schristos     {
17516dce513Schristos       crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
17616dce513Schristos       buf++;
17716dce513Schristos     }
17816dce513Schristos   return crc;
17916dce513Schristos }
180