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