This is an omnibus commit which moves the Citadel Server from crusty old GNU Autotool...
[citadel.git] / citadel / server / modules / fulltext / crc16.c
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