00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #define GLOBAL
00014
00015 #include <io.h>
00016 #include <stdlib.h>
00017 #include <stdio.h>
00018 #include <memory.h>
00019
00020 #include "config.h"
00021 #include "global.h"
00022
00023
00024
00025
00026 static unsigned int msk[33] =
00027 {
00028 0x00000000,0x00000001,0x00000003,0x00000007,
00029 0x0000000f,0x0000001f,0x0000003f,0x0000007f,
00030 0x000000ff,0x000001ff,0x000003ff,0x000007ff,
00031 0x00000fff,0x00001fff,0x00003fff,0x00007fff,
00032 0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff,
00033 0x000fffff,0x001fffff,0x003fffff,0x007fffff,
00034 0x00ffffff,0x01ffffff,0x03ffffff,0x07ffffff,
00035 0x0fffffff,0x1fffffff,0x3fffffff,0x7fffffff,
00036 0xffffffff
00037 };
00038
00039
00040
00041
00042 void initbits()
00043 {
00044 ld->incnt = 0;
00045 ld->rdptr = ld->rdbfr + recv_buf_size;
00046 ld->bitcnt = 0;
00047
00048 }
00049
00050 void fillbfr()
00051 {
00052 int l;
00053
00054 ld->inbfr[0] = ld->inbfr[8];
00055 ld->inbfr[1] = ld->inbfr[9];
00056 ld->inbfr[2] = ld->inbfr[10];
00057 ld->inbfr[3] = ld->inbfr[11];
00058
00059
00060 if (ld->rdptr >= ld->rdbfr + bits_recv_buf)
00061 {
00062 bits_recv_buf = recv(ld->pDataSock, recv_buf, recv_buf_size, 0);
00063 if((bits_recv_buf==SOCKET_ERROR)||(bits_recv_buf==0))
00064 {
00065 closesocket(ld->pDataSock);
00066 bits_recv_buf = 0;
00067 while (bits_recv_buf < recv_buf_size)
00068 {
00069 ld->rdbfr[bits_recv_buf ++] = 0;
00070 ld->rdbfr[bits_recv_buf ++] = 0;
00071 ld->rdbfr[bits_recv_buf ++] = (1 << 7) | (SE_CODE << 2);
00072 }
00073
00074 bits_recv_buf = recv_buf_size;
00075 }
00076 else
00077 {
00078
00079 memcpy(ld->rdbfr, recv_buf, bits_recv_buf);
00080 }
00081
00082 ld->rdptr = ld->rdbfr;
00083 }
00084
00085 for (l = 0; l < 8; l++)
00086 ld->inbfr[l + 4] = ld->rdptr[l];
00087
00088 ld->rdptr += 8;
00089 ld->incnt += 64;
00090 }
00091
00092
00093
00094
00095 unsigned int showbits(n)
00096 int n;
00097 {
00098 unsigned char *v;
00099 unsigned int b;
00100 int c;
00101
00102 if (ld->incnt<n)
00103 fillbfr();
00104
00105 v = ld->inbfr + ((96 - ld->incnt)>>3);
00106 b = (v[0]<<24) | (v[1]<<16) | (v[2]<<8) | v[3];
00107 c = ((ld->incnt-1) & 7) + 25;
00108 return (b>>(c-n)) & msk[n];
00109 }
00110
00111
00112
00113
00114 unsigned int getbits1()
00115 {
00116 return getbits(1);
00117 }
00118
00119
00120
00121
00122 void flushbits(n)
00123 int n;
00124 {
00125
00126 ld->bitcnt+= n;
00127 ld->incnt-= n;
00128 if (ld->incnt < 0)
00129 fillbfr();
00130 }
00131
00132
00133
00134
00135 unsigned int getbits(n)
00136 int n;
00137 {
00138 unsigned int l;
00139
00140 l = showbits(n);
00141 flushbits(n);
00142
00143 return l;
00144 }