Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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.