Back to index

citadel  8.12
crc16.c
Go to the documentation of this file.
00001 /****************************************************************************
00002 
00003   Filename:     crc16.c
00004   Description:  Cyclic Redundancy Check 16 functions
00005   Created:      24-Feb-1999
00006 
00007   Copyright (c) 1999-2003, Indigo Systems Corporation
00008   All rights reserved.
00009 
00010   Redistribution and use in source and binary forms, with or without
00011   modification, are permitted provided that the following conditions are met:
00012 
00013   Redistributions of source code must retain the above copyright notice, this
00014   list of conditions and the following disclaimer.
00015 
00016   Redistributions in binary form must reproduce the above copyright notice,
00017   this list of conditions and the following disclaimer in the documentation
00018   and/or other materials provided with the distribution.
00019 
00020   Neither the name of the Indigo Systems Corporation nor the names of its
00021   contributors may be used to endorse or promote products derived from this
00022   software without specific prior written permission.
00023 
00024   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00025   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00026   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00027   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00028   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00029   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00030   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00031   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00032   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00033   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
00034   THE POSSIBILITY OF SUCH DAMAGE.
00035 
00036 ****************************************************************************/
00037 
00038 #include "crc16.h"
00039 
00040 #ifdef _OPT_SIZE
00041 
00042 
00043 /*
00044  *  ===== ByteCRC16 =====
00045  *      Calculate (update) the CRC16 for a single 8-bit byte
00046  */
00047 int ByteCRC16(int value, int crcin)
00048 {
00049     int k = (((crcin >> 8) ^ value) & 255) << 8;
00050     int crc = 0;
00051     int bits = 8;
00052     do
00053     {
00054        if (( crc ^ k ) & 0x8000)
00055            crc = (crc << 1) ^ 0x1021;
00056        else
00057            crc <<= 1;
00058        k <<= 1;
00059     }
00060     while (--bits);
00061     return ((crcin << 8) ^ crc);
00062 }
00063 
00064 #else
00065 
00066 const CRC16 ccitt_16Table[] = {
00067    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
00068    0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
00069    0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
00070    0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
00071    0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
00072    0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
00073    0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
00074    0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
00075    0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
00076    0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
00077    0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
00078    0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
00079    0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
00080    0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
00081    0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
00082    0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
00083    0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
00084    0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
00085    0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
00086    0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
00087    0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
00088    0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
00089    0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
00090    0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
00091    0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
00092    0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
00093    0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
00094    0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
00095    0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
00096    0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
00097    0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
00098    0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
00099 };
00100 
00101 #define ByteCRC16(v, crc) \
00102        (unsigned short)((crc << 8) ^  ccitt_16Table[((crc >> 8) ^ (v)) & 255])
00103 
00104 /*
00105  *  ===== CalcCRC16Words =====
00106  *      Calculate the CRC for a buffer of 16-bit words.  Supports both
00107  *  Little and Big Endian formats using conditional compilation.
00108  *      Note: minimum count is 1 (0 case not handled)
00109  */
00110 CRC16 CalcCRC16Words(unsigned int count, short *buffer) {
00111 
00112     int crc = 0;
00113 
00114     do {
00115 
00116        int value = *buffer++;
00117 #ifdef _BIG_ENDIAN
00118        crc = ByteCRC16(value >> 8, crc);
00119        crc = ByteCRC16(value, crc);
00120 #else
00121        crc = ByteCRC16(value, crc);
00122        crc = ByteCRC16(value >> 8, crc);
00123 #endif
00124     }
00125        while (--count);
00126     return (CRC16) crc;
00127 }
00128 
00129 #endif /* _OPT_SIZE */
00130 
00131 #ifdef _CRC16_BYTES
00132 
00133 /*
00134  *  ===== CalcCRC16Bytes =====
00135  *      Calculate the CRC for a buffer of 8-bit words.
00136  *      Note: minimum count is 1 (0 case not handled)
00137  */
00138 CRC16 CalcCRC16Bytes(unsigned int count, char *buffer) {
00139 
00140     int crc = 0;
00141 
00142     do {
00143 
00144        int value = *buffer++;
00145        crc = ByteCRC16(value, crc);
00146     }
00147        while (--count);
00148     return crc;
00149 }
00150 
00151 #endif /* _CRC16_BYTES */
00152 
00153