00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 # ifdef HAVE_CONFIG_H
00023 # include "config.h"
00024 # endif
00025
00026 # include "global.h"
00027
00028 # ifdef HAVE_LIMITS_H
00029 # include <limits.h>
00030 # else
00031 # define CHAR_BIT 8
00032 # endif
00033
00034 # include "bit.h"
00035
00036
00037
00038
00039
00040
00041
00042
00043 static
00044 unsigned short const crc_table[256] = {
00045 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011,
00046 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022,
00047 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072,
00048 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041,
00049 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2,
00050 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1,
00051 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1,
00052 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082,
00053
00054 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192,
00055 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1,
00056 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1,
00057 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2,
00058 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151,
00059 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162,
00060 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132,
00061 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101,
00062
00063 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312,
00064 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321,
00065 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371,
00066 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342,
00067 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1,
00068 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2,
00069 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2,
00070 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381,
00071
00072 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291,
00073 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2,
00074 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2,
00075 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1,
00076 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252,
00077 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261,
00078 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231,
00079 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202
00080 };
00081
00082 # define CRC_POLY 0x8005
00083
00084
00085
00086
00087
00088 void mad_bit_init(struct mad_bitptr *bitptr, unsigned char const *byte)
00089 {
00090 bitptr->byte = byte;
00091 bitptr->cache = 0;
00092 bitptr->left = CHAR_BIT;
00093 }
00094
00095
00096
00097
00098
00099 unsigned int mad_bit_length(struct mad_bitptr const *begin,
00100 struct mad_bitptr const *end)
00101 {
00102 return begin->left +
00103 CHAR_BIT * (end->byte - (begin->byte + 1)) + (CHAR_BIT - end->left);
00104 }
00105
00106
00107
00108
00109
00110 unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *bitptr)
00111 {
00112 return bitptr->left == CHAR_BIT ? bitptr->byte : bitptr->byte + 1;
00113 }
00114
00115
00116
00117
00118
00119 void mad_bit_skip(struct mad_bitptr *bitptr, unsigned int len)
00120 {
00121 bitptr->byte += len / CHAR_BIT;
00122 bitptr->left -= len % CHAR_BIT;
00123
00124 if (bitptr->left > CHAR_BIT) {
00125 bitptr->byte++;
00126 bitptr->left += CHAR_BIT;
00127 }
00128
00129 if (bitptr->left < CHAR_BIT)
00130 bitptr->cache = *bitptr->byte;
00131 }
00132
00133
00134
00135
00136
00137 unsigned long mad_bit_read(struct mad_bitptr *bitptr, unsigned int len)
00138 {
00139 register unsigned long value;
00140
00141 if (bitptr->left == CHAR_BIT)
00142 bitptr->cache = *bitptr->byte;
00143
00144 if (len < bitptr->left) {
00145 value = (bitptr->cache & ((1 << bitptr->left) - 1)) >>
00146 (bitptr->left - len);
00147 bitptr->left -= len;
00148
00149 return value;
00150 }
00151
00152
00153
00154 value = bitptr->cache & ((1 << bitptr->left) - 1);
00155 len -= bitptr->left;
00156
00157 bitptr->byte++;
00158 bitptr->left = CHAR_BIT;
00159
00160
00161
00162 while (len >= CHAR_BIT) {
00163 value = (value << CHAR_BIT) | *bitptr->byte++;
00164 len -= CHAR_BIT;
00165 }
00166
00167 if (len > 0) {
00168 bitptr->cache = *bitptr->byte;
00169
00170 value = (value << len) | (bitptr->cache >> (CHAR_BIT - len));
00171 bitptr->left -= len;
00172 }
00173
00174 return value;
00175 }
00176
00177 # if 0
00178
00179
00180
00181
00182 void mad_bit_write(struct mad_bitptr *bitptr, unsigned int len,
00183 unsigned long value)
00184 {
00185 unsigned char *ptr;
00186
00187 ptr = (unsigned char *) bitptr->byte;
00188
00189
00190 }
00191 # endif
00192
00193
00194
00195
00196
00197 unsigned short mad_bit_crc(struct mad_bitptr bitptr, unsigned int len,
00198 unsigned short init)
00199 {
00200 register unsigned int crc;
00201
00202 for (crc = init; len >= 32; len -= 32) {
00203 register unsigned long data;
00204
00205 data = mad_bit_read(&bitptr, 32);
00206
00207 crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 24)) & 0xff];
00208 crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 16)) & 0xff];
00209 crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 8)) & 0xff];
00210 crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 0)) & 0xff];
00211 }
00212
00213 switch (len / 8) {
00214 case 3: crc = (crc << 8) ^
00215 crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
00216 case 2: crc = (crc << 8) ^
00217 crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
00218 case 1: crc = (crc << 8) ^
00219 crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
00220
00221 len %= 8;
00222
00223 case 0: break;
00224 }
00225
00226 while (len--) {
00227 register unsigned int msb;
00228
00229 msb = mad_bit_read(&bitptr, 1) ^ (crc >> 15);
00230
00231 crc <<= 1;
00232 if (msb & 1)
00233 crc ^= CRC_POLY;
00234 }
00235
00236 return crc & 0xffff;
00237 }