Home | History | Annotate | Download | only in libiberty
      1 /* crc32.c
      2    Copyright (C) 2009, 2011 Free Software Foundation, Inc.
      3 
      4    This file is part of the libiberty library.
      5 
      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.
     10 
     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.)
     19 
     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.
     24 
     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.
     28 */
     29 
     30 #ifdef HAVE_CONFIG_H
     31 #include "config.h"
     32 #endif
     33 
     34 #include "libiberty.h"
     35 
     36 /* This table was generated by the following program.  This matches
     37    what gdb does.
     38 
     39    #include <stdio.h>
     40 
     41    int
     42    main ()
     43    {
     44      int i, j;
     45      unsigned int c;
     46      int table[256];
     47 
     48      for (i = 0; i < 256; i++)
     49        {
     50 	 for (c = i << 24, j = 8; j > 0; --j)
     51 	   c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
     52 	 table[i] = c;
     53        }
     54 
     55      printf ("static const unsigned int crc32_table[] =\n{\n");
     56      for (i = 0; i < 256; i += 4)
     57        {
     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');
     63        }
     64      printf ("};\n");
     65      return 0;
     66    }
     67 
     68    For more information on CRC, see, e.g.,
     69    http://www.ross.net/crc/download/crc_v3.txt.  */
     70 
     71 static const unsigned int crc32_table[] =
     72 {
     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
    137 };
    138 
    139 /*
    140 
    141 @deftypefn Extension {unsigned int} crc32 (const unsigned char *@var{buf}, @
    142   int @var{len}, unsigned int @var{init})
    143 
    144 Compute the 32-bit CRC of @var{buf} which has length @var{len}.  The
    145 starting value is @var{init}; this may be used to compute the CRC of
    146 data split across multiple buffers by passing the return value of each
    147 call as the @var{init} parameter of the next.
    148 
    149 This is intended to match the CRC used by the @command{gdb} remote
    150 protocol for the @samp{qCRC} command.  In order to get the same
    151 results as gdb for a block of data, you must pass the first CRC
    152 parameter as @code{0xffffffff}.
    153 
    154 This CRC can be specified as:
    155 
    156   Width  : 32
    157   Poly   : 0x04c11db7
    158   Init   : parameter, typically 0xffffffff
    159   RefIn  : false
    160   RefOut : false
    161   XorOut : 0
    162 
    163 This differs from the "standard" CRC-32 algorithm in that the values
    164 are not reflected, and there is no final XOR value.  These differences
    165 make it easy to compose the values of multiple blocks.
    166 
    167 @end deftypefn
    168 
    169 */
    170 
    171 unsigned int
    172 xcrc32 (const unsigned char *buf, int len, unsigned int init)
    173 {
    174   unsigned int crc = init;
    175   while (len--)
    176     {
    177       crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
    178       buf++;
    179     }
    180   return crc;
    181 }
    182