/* 
 * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
 * 
 * This software may be freely used, copied, modified, and distributed
 * provided that the above copyright notice is preserved in all copies of the
 * software.
 */

/* -*-C-*-
 *
 * $Revision$
 *     $Date$
 *
 *
 * crc.c - provides some "standard" CRC calculation routines.
 *
 */
#include "crc.h"    /* describes this code */

/**********************************************************************/

/*
 * crc32                                                IEEE-802.3 32bit CRC
 * -----                                                --------------------
 */

/* This table was generated by the "crctable" program */
static const unsigned int crc32table[256] = {
                   /* 0x00 */ 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
                   /* 0x04 */ 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
                   /* 0x08 */ 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
                   /* 0x0C */ 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
                   /* 0x10 */ 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
                   /* 0x14 */ 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
                   /* 0x18 */ 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
                   /* 0x1C */ 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
                   /* 0x20 */ 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
                   /* 0x24 */ 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
                   /* 0x28 */ 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
                   /* 0x2C */ 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
                   /* 0x30 */ 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
                   /* 0x34 */ 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
                   /* 0x38 */ 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
                   /* 0x3C */ 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
                   /* 0x40 */ 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
                   /* 0x44 */ 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
                   /* 0x48 */ 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
                   /* 0x4C */ 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
                   /* 0x50 */ 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
                   /* 0x54 */ 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
                   /* 0x58 */ 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
                   /* 0x5C */ 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
                   /* 0x60 */ 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
                   /* 0x64 */ 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
                   /* 0x68 */ 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
                   /* 0x6C */ 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
                   /* 0x70 */ 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
                   /* 0x74 */ 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
                   /* 0x78 */ 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
                   /* 0x7C */ 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
                   /* 0x80 */ 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
                   /* 0x84 */ 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
                   /* 0x88 */ 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
                   /* 0x8C */ 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
                   /* 0x90 */ 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
                   /* 0x94 */ 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
                   /* 0x98 */ 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
                   /* 0x9C */ 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
                   /* 0xA0 */ 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
                   /* 0xA4 */ 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
                   /* 0xA8 */ 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
                   /* 0xAC */ 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
                   /* 0xB0 */ 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
                   /* 0xB4 */ 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
                   /* 0xB8 */ 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
                   /* 0xBC */ 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
                   /* 0xC0 */ 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
                   /* 0xC4 */ 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
                   /* 0xC8 */ 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
                   /* 0xCC */ 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
                   /* 0xD0 */ 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
                   /* 0xD4 */ 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
                   /* 0xD8 */ 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
                   /* 0xDC */ 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
                   /* 0xE0 */ 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
                   /* 0xE4 */ 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
                   /* 0xE8 */ 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
                   /* 0xEC */ 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
                   /* 0xF0 */ 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
                   /* 0xF4 */ 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
                   /* 0xF8 */ 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
                   /* 0xFC */ 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
                                            };
unsigned int crc32(unsigned char *address, unsigned int size, unsigned int crc)
{
#if 0
  /* FAST, but bigger and only good for word-aligned data */
  unsigned int *daddr = (unsigned int *)address;
  unsigned int  data = FALSE; /* little-endian by default */

 /*
  * TODO: We should really get the current processor big- or
  * little-endian state and set "data" accordingly.
  */

  /* Perform word loop to save on memory accesses */
  if (data)
    /* big-endian */
    for (; (size > 0); size -= sizeof(unsigned int))
    {
      data = *daddr++;
      crc = (((crc >> 8) & 0x00FFFFFF) ^
             crc32table[(crc ^ ((data >> 24) & 0xFF)) & 0xFF]);
      crc = (((crc >> 8) & 0x00FFFFFF) ^
             crc32table[(crc ^ ((data >> 16) & 0xFF)) & 0xFF]);
      crc = (((crc >> 8) & 0x00FFFFFF) ^
             crc32table[(crc ^ ((data >>  8) & 0xFF)) & 0xFF]);
      crc = (((crc >> 8) & 0x00FFFFFF) ^
             crc32table[(crc ^ ((data >>  0) & 0xFF)) & 0xFF]);
    }
  else
    for (; (size > 0); size -= sizeof(unsigned int))
    {
      data = *daddr++;
      crc = (((crc >> 8) & 0x00FFFFFF) ^
             crc32table[(crc ^ ((data >>  0) & 0xFF)) & 0xFF]);
      crc = (((crc >> 8) & 0x00FFFFFF) ^
             crc32table[(crc ^ ((data >>  8) & 0xFF)) & 0xFF]);
      crc = (((crc >> 8) & 0x00FFFFFF) ^
             crc32table[(crc ^ ((data >> 16) & 0xFF)) & 0xFF]);
      crc = (((crc >> 8) & 0x00FFFFFF) ^
             crc32table[(crc ^ ((data >> 24) & 0xFF)) & 0xFF]);
    }
#else
  for (; (size > 0); size--)
    /* byte loop */
    crc = (((crc >> 8) & 0x00FFFFFF) ^
           crc32table[(crc ^ *address++) & 0x000000FF]);
#endif

  return(crc);
}

/**********************************************************************/

/*
 * crc16                                                     16bit CRC-CCITT
 * -----                                                     ---------------
 * This function provides a table driven 16bit CRC generation for byte data.
 * This CRC is also known as the HDLC CRC.
 */
/*
 * 960201 KWelton
 *
 *TODO: Is this correct?  The compiler predefines __arm, *not* __ARM
 */
#ifdef __ARM
/*
 * To make the code quicker on the ARM, we double the table size and
 * use integer slots rather than short slots for the table.
 */
static const unsigned int crctableA[16] = {
#else
static const unsigned short crctableA[16] = {
#endif
                                             0x0000,
                                             0x1081,
                                             0x2102,
                                             0x3183,
                                             0x4204,
                                             0x5285,
                                             0x6306,
                                             0x7387,
                                             0x8408,
                                             0x9489,
                                             0xA50A,
                                             0xB58B,
                                             0xC60C,
                                             0xD68D,
                                             0xE70E,
                                             0xF78F
                                            };

#ifdef __ARM
/* See comments above */
static const unsigned int crctableB[16] = {
#else
static const unsigned short crctableB[16] = {
#endif
                                             0x0000,
                                             0x1189,
                                             0x2312,
                                             0x329B,
                                             0x4624,
                                             0x57AD,
                                             0x6536,
                                             0x74BF,
                                             0x8C48,
                                             0x9DC1,
                                             0xAF5A,
                                             0xBED3,
                                             0xCA6C,
                                             0xDBE5,
                                             0xE97E,
                                             0xF8F7
                                            };

unsigned short crc16(unsigned char *address, unsigned int size,
                     unsigned short crc)
{
  for (; (size > 0); size--)
  {
    /* byte loop */
    unsigned char data = *address++; /* fetch the next data byte */

    data ^= crc; /* EOR data with current CRC value */
    crc = ((crctableA[(data & 0xF0) >> 4] ^ crctableB[data & 0x0F]) ^
           (crc >> 8));
  }

  return(crc);
}

/**********************************************************************/

#if 0 /* not required at the moment */

/*
 * elf_hash
 * --------
 * This function is derived from the one on page 68 of chapter of the "Unix
 * SVR4 Programmer's Guide". It is used to generate a hash-code from a
 * symbol name.
 */
unsigned int elf_hash(const unsigned char *name)
{
  unsigned int h = 0;
  unsigned int g;

  /* NULL pointer returns a hash of zero */
  while (name && (*name))
  {
    h = ((h << 4) + *name++);

    if (g = (h & 0xF0000000))
      h ^= (g >> 24);

    h &= ~g;
  }

  return(h);
}
#endif

/**********************************************************************/

/* EOF crc.c */
