"Fossies" - the Fresh Open Source Software Archive

Member "citadel/modules/fulltext/crc16.c" (5 Jun 2021, 5477 Bytes) of package /linux/www/citadel.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "crc16.c" see the Fossies "Dox" file reference documentation.

    1 /****************************************************************************
    2 
    3   Filename:     crc16.c
    4   Description:  Cyclic Redundancy Check 16 functions
    5   Created:      24-Feb-1999
    6 
    7   Copyright (c) 1999-2003, Indigo Systems Corporation
    8   All rights reserved.
    9 
   10   Redistribution and use in source and binary forms, with or without
   11   modification, are permitted provided that the following conditions are met:
   12 
   13   Redistributions of source code must retain the above copyright notice, this
   14   list of conditions and the following disclaimer.
   15 
   16   Redistributions in binary form must reproduce the above copyright notice,
   17   this list of conditions and the following disclaimer in the documentation
   18   and/or other materials provided with the distribution.
   19 
   20   Neither the name of the Indigo Systems Corporation nor the names of its
   21   contributors may be used to endorse or promote products derived from this
   22   software without specific prior written permission.
   23 
   24   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   25   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   26   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   27   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
   28   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   29   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   30   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   31   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   32   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   33   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
   34   THE POSSIBILITY OF SUCH DAMAGE.
   35 
   36 ****************************************************************************/
   37 
   38 #include "crc16.h"
   39 
   40 #ifdef _OPT_SIZE
   41 
   42 
   43 /*
   44  *  ===== ByteCRC16 =====
   45  *      Calculate (update) the CRC16 for a single 8-bit byte
   46  */
   47 int ByteCRC16(int value, int crcin)
   48 {
   49     int k = (((crcin >> 8) ^ value) & 255) << 8;
   50     int crc = 0;
   51     int bits = 8;
   52     do
   53     {
   54     if (( crc ^ k ) & 0x8000)
   55         crc = (crc << 1) ^ 0x1021;
   56     else
   57         crc <<= 1;
   58     k <<= 1;
   59     }
   60     while (--bits);
   61     return ((crcin << 8) ^ crc);
   62 }
   63 
   64 #else
   65 
   66 const CRC16 ccitt_16Table[] = {
   67    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
   68    0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
   69    0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
   70    0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
   71    0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
   72    0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
   73    0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
   74    0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
   75    0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
   76    0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
   77    0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
   78    0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
   79    0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
   80    0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
   81    0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
   82    0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
   83    0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
   84    0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
   85    0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
   86    0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
   87    0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
   88    0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
   89    0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
   90    0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
   91    0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
   92    0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
   93    0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
   94    0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
   95    0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
   96    0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
   97    0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
   98    0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
   99 };
  100 
  101 #define ByteCRC16(v, crc) \
  102     (unsigned short)((crc << 8) ^  ccitt_16Table[((crc >> 8) ^ (v)) & 255])
  103 
  104 /*
  105  *  ===== CalcCRC16Words =====
  106  *      Calculate the CRC for a buffer of 16-bit words.  Supports both
  107  *  Little and Big Endian formats using conditional compilation.
  108  *      Note: minimum count is 1 (0 case not handled)
  109  */
  110 CRC16 CalcCRC16Words(unsigned int count, short *buffer) {
  111 
  112     int crc = 0;
  113 
  114     do {
  115 
  116     int value = *buffer++;
  117 #ifdef _BIG_ENDIAN
  118     crc = ByteCRC16(value >> 8, crc);
  119     crc = ByteCRC16(value, crc);
  120 #else
  121     crc = ByteCRC16(value, crc);
  122     crc = ByteCRC16(value >> 8, crc);
  123 #endif
  124     }
  125     while (--count);
  126     return (CRC16) crc;
  127 }
  128 
  129 #endif /* _OPT_SIZE */
  130 
  131 #ifdef _CRC16_BYTES
  132 
  133 /*
  134  *  ===== CalcCRC16Bytes =====
  135  *      Calculate the CRC for a buffer of 8-bit words.
  136  *      Note: minimum count is 1 (0 case not handled)
  137  */
  138 CRC16 CalcCRC16Bytes(unsigned int count, char *buffer) {
  139 
  140     int crc = 0;
  141 
  142     do {
  143 
  144     int value = *buffer++;
  145     crc = ByteCRC16(value, crc);
  146     }
  147     while (--count);
  148     return crc;
  149 }
  150 
  151 #endif /* _CRC16_BYTES */
  152 
  153