Home | History | Annotate | Line # | Download | only in libiberty
crc32.c revision 1.1.1.2
      1      1.1  christos /* crc32.c
      2      1.1  christos    Copyright (C) 2009, 2011 Free Software Foundation, Inc.
      3      1.1  christos 
      4      1.1  christos    This file is part of the libiberty library.
      5      1.1  christos 
      6      1.1  christos    This file is free software; you can redistribute it and/or modify
      7      1.1  christos    it under the terms of the GNU General Public License as published by
      8      1.1  christos    the Free Software Foundation; either version 2 of the License, or
      9      1.1  christos    (at your option) any later version.
     10      1.1  christos 
     11      1.1  christos    In addition to the permissions in the GNU General Public License, the
     12      1.1  christos    Free Software Foundation gives you unlimited permission to link the
     13      1.1  christos    compiled version of this file into combinations with other programs,
     14      1.1  christos    and to distribute those combinations without any restriction coming
     15      1.1  christos    from the use of this file.  (The General Public License restrictions
     16      1.1  christos    do apply in other respects; for example, they cover modification of
     17      1.1  christos    the file, and distribution when not linked into a combined
     18      1.1  christos    executable.)
     19      1.1  christos 
     20      1.1  christos    This program is distributed in the hope that it will be useful,
     21      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     22      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     23      1.1  christos    GNU General Public License for more details.
     24      1.1  christos 
     25      1.1  christos    You should have received a copy of the GNU General Public License
     26      1.1  christos    along with this program; if not, write to the Free Software
     27      1.1  christos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
     28      1.1  christos */
     29      1.1  christos 
     30      1.1  christos #ifdef HAVE_CONFIG_H
     31      1.1  christos #include "config.h"
     32      1.1  christos #endif
     33      1.1  christos 
     34      1.1  christos #include "libiberty.h"
     35      1.1  christos 
     36  1.1.1.2  christos /* This table was generated by the following program.
     37      1.1  christos 
     38      1.1  christos    #include <stdio.h>
     39      1.1  christos 
     40      1.1  christos    int
     41      1.1  christos    main ()
     42      1.1  christos    {
     43  1.1.1.2  christos      unsigned int i, j;
     44      1.1  christos      unsigned int c;
     45      1.1  christos      int table[256];
     46      1.1  christos 
     47      1.1  christos      for (i = 0; i < 256; i++)
     48      1.1  christos        {
     49      1.1  christos 	 for (c = i << 24, j = 8; j > 0; --j)
     50      1.1  christos 	   c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
     51      1.1  christos 	 table[i] = c;
     52      1.1  christos        }
     53      1.1  christos 
     54      1.1  christos      printf ("static const unsigned int crc32_table[] =\n{\n");
     55      1.1  christos      for (i = 0; i < 256; i += 4)
     56      1.1  christos        {
     57      1.1  christos 	 printf ("  0x%08x, 0x%08x, 0x%08x, 0x%08x",
     58      1.1  christos 		 table[i + 0], table[i + 1], table[i + 2], table[i + 3]);
     59      1.1  christos 	 if (i + 4 < 256)
     60      1.1  christos 	   putchar (',');
     61      1.1  christos 	 putchar ('\n');
     62      1.1  christos        }
     63      1.1  christos      printf ("};\n");
     64      1.1  christos      return 0;
     65      1.1  christos    }
     66      1.1  christos 
     67      1.1  christos    For more information on CRC, see, e.g.,
     68      1.1  christos    http://www.ross.net/crc/download/crc_v3.txt.  */
     69      1.1  christos 
     70      1.1  christos static const unsigned int crc32_table[] =
     71      1.1  christos {
     72      1.1  christos   0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
     73      1.1  christos   0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
     74      1.1  christos   0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
     75      1.1  christos   0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
     76      1.1  christos   0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
     77      1.1  christos   0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
     78      1.1  christos   0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
     79      1.1  christos   0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
     80      1.1  christos   0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
     81      1.1  christos   0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
     82      1.1  christos   0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
     83      1.1  christos   0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
     84      1.1  christos   0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
     85      1.1  christos   0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
     86      1.1  christos   0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
     87      1.1  christos   0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
     88      1.1  christos   0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
     89      1.1  christos   0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
     90      1.1  christos   0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
     91      1.1  christos   0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
     92      1.1  christos   0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
     93      1.1  christos   0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
     94      1.1  christos   0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
     95      1.1  christos   0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
     96      1.1  christos   0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
     97      1.1  christos   0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
     98      1.1  christos   0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
     99      1.1  christos   0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
    100      1.1  christos   0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
    101      1.1  christos   0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
    102      1.1  christos   0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
    103      1.1  christos   0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
    104      1.1  christos   0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
    105      1.1  christos   0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
    106      1.1  christos   0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
    107      1.1  christos   0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
    108      1.1  christos   0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
    109      1.1  christos   0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
    110      1.1  christos   0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
    111      1.1  christos   0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
    112      1.1  christos   0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
    113      1.1  christos   0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
    114      1.1  christos   0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
    115      1.1  christos   0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
    116      1.1  christos   0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
    117      1.1  christos   0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
    118      1.1  christos   0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
    119      1.1  christos   0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
    120      1.1  christos   0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
    121      1.1  christos   0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
    122      1.1  christos   0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
    123      1.1  christos   0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
    124      1.1  christos   0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
    125      1.1  christos   0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
    126      1.1  christos   0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
    127      1.1  christos   0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
    128      1.1  christos   0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
    129      1.1  christos   0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
    130      1.1  christos   0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
    131      1.1  christos   0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
    132      1.1  christos   0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
    133      1.1  christos   0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
    134      1.1  christos   0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
    135      1.1  christos   0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
    136      1.1  christos };
    137      1.1  christos 
    138      1.1  christos /*
    139      1.1  christos 
    140      1.1  christos @deftypefn Extension {unsigned int} crc32 (const unsigned char *@var{buf}, @
    141      1.1  christos   int @var{len}, unsigned int @var{init})
    142      1.1  christos 
    143      1.1  christos Compute the 32-bit CRC of @var{buf} which has length @var{len}.  The
    144      1.1  christos starting value is @var{init}; this may be used to compute the CRC of
    145      1.1  christos data split across multiple buffers by passing the return value of each
    146      1.1  christos call as the @var{init} parameter of the next.
    147      1.1  christos 
    148  1.1.1.2  christos This is used by the @command{gdb} remote protocol for the @samp{qCRC}
    149  1.1.1.2  christos command.  In order to get the same results as gdb for a block of data,
    150  1.1.1.2  christos you must pass the first CRC parameter as @code{0xffffffff}.
    151      1.1  christos 
    152      1.1  christos This CRC can be specified as:
    153      1.1  christos 
    154      1.1  christos   Width  : 32
    155      1.1  christos   Poly   : 0x04c11db7
    156      1.1  christos   Init   : parameter, typically 0xffffffff
    157      1.1  christos   RefIn  : false
    158      1.1  christos   RefOut : false
    159      1.1  christos   XorOut : 0
    160      1.1  christos 
    161      1.1  christos This differs from the "standard" CRC-32 algorithm in that the values
    162      1.1  christos are not reflected, and there is no final XOR value.  These differences
    163      1.1  christos make it easy to compose the values of multiple blocks.
    164      1.1  christos 
    165      1.1  christos @end deftypefn
    166      1.1  christos 
    167      1.1  christos */
    168      1.1  christos 
    169      1.1  christos unsigned int
    170      1.1  christos xcrc32 (const unsigned char *buf, int len, unsigned int init)
    171      1.1  christos {
    172      1.1  christos   unsigned int crc = init;
    173      1.1  christos   while (len--)
    174      1.1  christos     {
    175      1.1  christos       crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
    176      1.1  christos       buf++;
    177      1.1  christos     }
    178      1.1  christos   return crc;
    179      1.1  christos }
    180