39 #include <arpa/inet.h> 
   53 #define _copysign copysign 
   56 using namespace SLNet;
 
   67     data = ( 
unsigned char* ) stackData;
 
   82         data = ( 
unsigned char* ) stackData;
 
   88         numberOfBitsAllocated = initialBytesToAllocate << 3;
 
   99     numberOfBitsUsed = lengthInBytes << 3;
 
  101     copyData = _copyData;
 
  102     numberOfBitsAllocated = lengthInBytes << 3;
 
  106         if ( lengthInBytes > 0 )
 
  110                 data = ( 
unsigned char* ) stackData;
 
  120             memcpy( data, _data, (
size_t) lengthInBytes );
 
  126         data = ( 
unsigned char* ) _data;
 
  135     numberOfBitsAllocated = lengthInBits;
 
  150     if ( numberOfBitsUsed > 0 )
 
  157     numberOfBitsUsed = 0;
 
  170     if (numberOfBytes==0)
 
  174     if ((numberOfBitsUsed & 7) == 0)
 
  177         memcpy(data+
BITS_TO_BYTES(numberOfBitsUsed), inputByteArray, (
size_t) numberOfBytes);
 
  182         WriteBits( ( 
unsigned char* ) inputByteArray, numberOfBytes * 8, 
true );
 
  198     if ((bitStream->
GetReadOffset()&7)==0 && (numberOfBitsUsed&7)==0)
 
  201         int numBytes=numberOfBits/8;
 
  202         memcpy(data + (numberOfBitsUsed >> 3), bitStream->
GetData()+readOffsetBytes, numBytes);
 
  208     while (numberOfBits-->0)
 
  210         numberOfBitsMod8 = numberOfBitsUsed & 7;
 
  211         if ( numberOfBitsMod8 == 0 )
 
  214             if (bitStream->data[ bitStream->readOffset >> 3 ] & ( 0x80 >> ( bitStream->readOffset & 7 ) ) )
 
  217                 data[ numberOfBitsUsed >> 3 ] = 0x80;
 
  222                 data[ numberOfBitsUsed >> 3 ] = 0;
 
  229             if (bitStream->data[ bitStream->readOffset >> 3 ] & ( 0x80 >> ( bitStream->readOffset & 7 ) ) )
 
  230                 data[ numberOfBitsUsed >> 3 ] |= 0x80 >> ( numberOfBitsMod8 ); 
 
  234         bitStream->readOffset++;
 
  240     Write(&bitStream, numberOfBits);
 
  250     bitStream->
Write(
this, numberOfBits);
 
  255     bitStream->
Write(
this);
 
  262     bitStream.
Write(
this, numberOfBits);
 
  267     bitStream.
Write(
this);
 
  275     if ((readOffset & 7) == 0)
 
  281         memcpy( outByteArray, data + ( readOffset >> 3 ), (
size_t) numberOfBytes );
 
  283         readOffset += numberOfBytes << 3;
 
  288         return ReadBits( ( 
unsigned char* ) outByteArray, numberOfBytes * 8 );
 
  301     numberOfBitsUsed = 0;
 
  310     if ( ( numberOfBitsUsed & 7 ) == 0 )
 
  311         data[ numberOfBitsUsed >> 3 ] = 0;
 
  321     BitSize_t numberOfBitsMod8 = numberOfBitsUsed & 7;
 
  323     if ( numberOfBitsMod8 == 0 )
 
  324         data[ numberOfBitsUsed >> 3 ] = 0x80;
 
  326         data[ numberOfBitsUsed >> 3 ] |= 0x80 >> ( numberOfBitsMod8 ); 
 
  338     bool result = ( data[ readOffset >> 3 ] & ( 0x80 >> ( readOffset & 7 ) ) ) !=0;
 
  349     Write((
const char*) inByteArray, numberOfBytesToWrite);
 
  361     if (inByteArray==0 || inputLength==0)
 
  367     WriteAlignedBytes((
const unsigned char*) inByteArray, inputLength < maxBytesToWrite ? inputLength : maxBytesToWrite);
 
  379     if ( numberOfBytesToRead <= 0 )
 
  389     memcpy( inOutByteArray, data + ( readOffset >> 3 ), (
size_t) numberOfBytesToRead );
 
  391     readOffset += numberOfBytesToRead << 3;
 
  397     return ReadAlignedBytesSafe(inOutByteArray,(
unsigned int&) inputLength,(
unsigned int)maxBytesToRead);
 
  403     if (inputLength > maxBytesToRead)
 
  404         inputLength=maxBytesToRead;
 
  419     if (inputLength > maxBytesToRead)
 
  420         inputLength=maxBytesToRead;
 
  435     const BitSize_t numberOfBitsUsedMod8 = numberOfBitsUsed & 7;
 
  438     if (numberOfBitsUsedMod8==0 && (numberOfBitsToWrite&7)==0)
 
  440         memcpy( data + ( numberOfBitsUsed >> 3 ), inByteArray, numberOfBitsToWrite>>3);
 
  441         numberOfBitsUsed+=numberOfBitsToWrite;
 
  445     unsigned char dataByte;
 
  446     const unsigned char* inputPtr=inByteArray;
 
  449     while ( numberOfBitsToWrite > 0 )
 
  452         dataByte = *( inputPtr++ );
 
  454         if ( numberOfBitsToWrite < 8 && rightAlignedBits )   
 
  455             dataByte <<= 8 - numberOfBitsToWrite;  
 
  458         if ( numberOfBitsUsedMod8 == 0 )
 
  459             * ( data + ( numberOfBitsUsed >> 3 ) ) = dataByte;
 
  463             *( data + ( numberOfBitsUsed >> 3 ) ) |= dataByte >> ( numberOfBitsUsedMod8 ); 
 
  465             if ( 8 - ( numberOfBitsUsedMod8 ) < 8 && 8 - ( numberOfBitsUsedMod8 ) < numberOfBitsToWrite )   
 
  467                 *( data + ( numberOfBitsUsed >> 3 ) + 1 ) = (
unsigned char) ( dataByte << ( 8 - ( numberOfBitsUsedMod8 ) ) ); 
 
  471         if ( numberOfBitsToWrite >= 8 )
 
  473             numberOfBitsUsed += 8;
 
  474             numberOfBitsToWrite -= 8;
 
  478             numberOfBitsUsed += numberOfBitsToWrite;
 
  479             numberOfBitsToWrite=0;
 
  494                                 const unsigned int size, 
const bool unsignedData )
 
  496     BitSize_t currentByte = ( size >> 3 ) - 1; 
 
  498     unsigned char byteMatch;
 
  512     while ( currentByte > 0 )
 
  514         if ( inByteArray[ currentByte ] == byteMatch )   
 
  525             WriteBits( inByteArray, ( currentByte + 1 ) << 3, 
true );
 
  536     if ( ( unsignedData && ( ( *( inByteArray + currentByte ) ) & 0xF0 ) == 0x00 ) ||
 
  537         ( unsignedData == 
false && ( ( *( inByteArray + currentByte ) ) & 0xF0 ) == 0xF0 ) )
 
  541         WriteBits( inByteArray + currentByte, 4, 
true );
 
  548         WriteBits( inByteArray + currentByte, 8, 
true );
 
  560     if (numberOfBitsToRead<=0)
 
  567     const BitSize_t readOffsetMod8 = readOffset & 7;
 
  570     if (readOffsetMod8==0 && (numberOfBitsToRead&7)==0)
 
  572         memcpy( inOutByteArray, data + ( readOffset >> 3 ), numberOfBitsToRead>>3);
 
  573         readOffset+=numberOfBitsToRead;
 
  581     memset( inOutByteArray, 0, (
size_t) 
BITS_TO_BYTES( numberOfBitsToRead ) );
 
  583     while ( numberOfBitsToRead > 0 )
 
  585         *( inOutByteArray + offset ) |= *( data + ( readOffset >> 3 ) ) << ( readOffsetMod8 ); 
 
  587         if ( readOffsetMod8 > 0 && numberOfBitsToRead > 8 - ( readOffsetMod8 ) )   
 
  588             *( inOutByteArray + offset ) |= *( data + ( readOffset >> 3 ) + 1 ) >> ( 8 - ( readOffsetMod8 ) ); 
 
  590         if (numberOfBitsToRead>=8)
 
  592             numberOfBitsToRead -= 8;
 
  598             int neg = (int) numberOfBitsToRead - 8;
 
  603                 if ( alignBitsToRight )
 
  604                     * ( inOutByteArray + offset ) >>= -neg;
 
  606                 readOffset += 8 + neg;
 
  613             numberOfBitsToRead=0;
 
  622                                const unsigned int size, 
const bool unsignedData )
 
  624     unsigned int currentByte = ( size >> 3 ) - 1;
 
  627     unsigned char byteMatch, halfByteMatch;
 
  638         halfByteMatch = 0xF0;
 
  643     while ( currentByte > 0 )
 
  649         if ( 
Read( b ) == false )
 
  654             inOutByteArray[ currentByte ] = byteMatch;
 
  661             if ( 
ReadBits( inOutByteArray, ( currentByte + 1 ) << 3 ) == false )
 
  671     if ( readOffset + 1 > numberOfBitsUsed )
 
  676     if ( 
Read( b ) == false )
 
  682         if ( 
ReadBits( inOutByteArray + currentByte, 4 ) == false )
 
  685         inOutByteArray[ currentByte ] |= halfByteMatch; 
 
  689         if ( 
ReadBits( inOutByteArray + currentByte, 8 ) == false )
 
  699     BitSize_t newNumberOfBitsAllocated = numberOfBitsToWrite + numberOfBitsUsed;
 
  701     if ( numberOfBitsToWrite + numberOfBitsUsed > 0 && ( ( numberOfBitsAllocated - 1 ) >> 3 ) < ( ( newNumberOfBitsAllocated - 1 ) >> 3 ) )   
 
  712         newNumberOfBitsAllocated = ( numberOfBitsToWrite + numberOfBitsUsed ) * 2;
 
  713         if (newNumberOfBitsAllocated - ( numberOfBitsToWrite + numberOfBitsUsed ) > 1048576 )
 
  714             newNumberOfBitsAllocated = numberOfBitsToWrite + numberOfBitsUsed + 1048576;
 
  719         if (data==(
unsigned char*)stackData)
 
  727                 memcpy ((
void *)data, (
void *)stackData, (
size_t) 
BITS_TO_BYTES( numberOfBitsAllocated )); 
 
  741     if ( newNumberOfBitsAllocated > numberOfBitsAllocated )
 
  742         numberOfBitsAllocated = newNumberOfBitsAllocated;
 
  746     return numberOfBitsAllocated;
 
  755         memset(data+
BITS_TO_BYTES(numberOfBitsUsed), 0, (
size_t) numToWrite);
 
  792     y = x >> 4;  
if (y != 0) {n = n - 4;  x = y;}
 
  793     y = x >> 2;  
if (y != 0) {n = n - 2;  x = y;}
 
  794     y = x >> 1;  
if (y != 0) 
return n - 2;
 
  804     y = x >> 8;  
if (y != 0) {n = n - 8;  x = y;}
 
  805     y = x >> 4;  
if (y != 0) {n = n - 4;  x = y;}
 
  806     y = x >> 2;  
if (y != 0) {n = n - 2;  x = y;}
 
  807     y = x >> 1;  
if (y != 0) 
return n - 2;
 
  817     y = x >>16;  
if (y != 0) {n = n -16;  x = y;}
 
  818     y = x >> 8;  
if (y != 0) {n = n - 8;  x = y;}
 
  819     y = x >> 4;  
if (y != 0) {n = n - 4;  x = y;}
 
  820     y = x >> 2;  
if (y != 0) {n = n - 2;  x = y;}
 
  821     y = x >> 1;  
if (y != 0) 
return n - 2;
 
  831     y = x >>32;  
if (y != 0) {n = n -32;  x = y;}
 
  832     y = x >>16;  
if (y != 0) {n = n -16;  x = y;}
 
  833     y = x >> 8;  
if (y != 0) {n = n - 8;  x = y;}
 
  834     y = x >> 4;  
if (y != 0) {n = n - 4;  x = y;}
 
  835     y = x >> 2;  
if (y != 0) {n = n - 2;  x = y;}
 
  836     y = x >> 1;  
if (y != 0) 
return n - 2;
 
  843     RakAssert( readOffset == numberOfBitsUsed );
 
  848     if (numberOfBitsUsed <= 0)
 
  850 #pragma warning(push) 
  851 #pragma warning(disable:4996) 
  852         strcpy(out, 
"No bits\n");
 
  857     unsigned int strIndex = 0;
 
  862         if (counter == (numberOfBitsUsed - 1) >> 3)
 
  863             stop = 8 - (((numberOfBitsUsed - 1) & 7) + 1);
 
  867         for (
BitSize_t counter2 = 7; counter2 >= stop; counter2--)
 
  869             if ((data[counter] >> counter2) & 1)
 
  870                 out[strIndex++] = 
'1';
 
  872                 out[strIndex++] = 
'0';
 
  878         out[strIndex++] = 
' ';
 
  881     out[strIndex++] = 
'\n';
 
  888     if ( numberOfBitsUsed <= 0 )
 
  890         strcpy_s(out, outLength, 
"No bits\n" );
 
  894     unsigned int strIndex=0;
 
  899         if ( counter == ( numberOfBitsUsed - 1 ) >> 3 )
 
  900             stop = 8 - ( ( ( numberOfBitsUsed - 1 ) & 7 ) + 1 );
 
  904         for ( 
BitSize_t counter2 = 7; counter2 >= stop; counter2-- )
 
  906             if ( ( data[ counter ] >> counter2 ) & 1 )
 
  918     out[strIndex++]=
'\n';
 
  934         sprintf_s(out+i*3, outLength-i*3, 
"%02x ", data[i]);
 
  943 #pragma warning(push) 
  944 #pragma warning(disable:4996) 
  945         sprintf(out + i * 3, 
"%02x ", data[i]);
 
  966     memcpy( *_data, data, 
sizeof(
unsigned char) * (
size_t) ( 
BITS_TO_BYTES( numberOfBitsUsed ) ) );
 
  967     return numberOfBitsUsed;
 
  973     readOffset += numberOfBits;
 
  985     numberOfBitsUsed = offset;
 
 1034     if ( copyData == 
false )
 
 1038         if ( numberOfBitsAllocated > 0 )
 
 1046             memcpy( newdata, data, (
size_t) 
BITS_TO_BYTES( numberOfBitsAllocated ) );
 
 1061     static unsigned long htonlValue = htonl(12345);
 
 1062     return htonlValue == 12345;
 
 1068         inOutByteArray[i]=inByteArray[length-i-1];
 
 1074     for (i=0; i < (length>>1); i++)
 
 1076         temp = inOutData[i];
 
 1077         inOutData[i]=inOutData[length-i-1];
 
 1078         inOutData[length-i-1]=temp;
 
 1094     data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0];
 
 1095     numberOfBitsUsed+=1*8;
 
 1103     inOutByteArray[0] = data[( readOffset >> 3 ) + 0];
 
 1111 #ifndef __BITSTREAM_NATIVE_END 
 1114         data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[1];
 
 1115         data[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[0];
 
 1120         data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0];
 
 1121         data[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[1];
 
 1124     numberOfBitsUsed+=2*8;
 
 1131 #ifndef __BITSTREAM_NATIVE_END 
 1134         inOutByteArray[0] = data[( readOffset >> 3 ) + 1];
 
 1135         inOutByteArray[1] = data[( readOffset >> 3 ) + 0];
 
 1140         inOutByteArray[0] = data[( readOffset >> 3 ) + 0];
 
 1141         inOutByteArray[1] = data[( readOffset >> 3 ) + 1];
 
 1151 #ifndef __BITSTREAM_NATIVE_END 
 1154         data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[3];
 
 1155         data[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[2];
 
 1156         data[( numberOfBitsUsed >> 3 ) + 2] = inByteArray[1];
 
 1157         data[( numberOfBitsUsed >> 3 ) + 3] = inByteArray[0];
 
 1162         data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0];
 
 1163         data[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[1];
 
 1164         data[( numberOfBitsUsed >> 3 ) + 2] = inByteArray[2];
 
 1165         data[( numberOfBitsUsed >> 3 ) + 3] = inByteArray[3];
 
 1168     numberOfBitsUsed+=4*8;
 
 1175 #ifndef __BITSTREAM_NATIVE_END 
 1178         inOutByteArray[0] = data[( readOffset >> 3 ) + 3];
 
 1179         inOutByteArray[1] = data[( readOffset >> 3 ) + 2];
 
 1180         inOutByteArray[2] = data[( readOffset >> 3 ) + 1];
 
 1181         inOutByteArray[3] = data[( readOffset >> 3 ) + 0];
 
 1186         inOutByteArray[0] = data[( readOffset >> 3 ) + 0];
 
 1187         inOutByteArray[1] = data[( readOffset >> 3 ) + 1];
 
 1188         inOutByteArray[2] = data[( readOffset >> 3 ) + 2];
 
 1189         inOutByteArray[3] = data[( readOffset >> 3 ) + 3];
 
 1197     unsigned short percentile;
 
 1198     if (
Read(percentile))
 
 1201         outFloat = floatMin + ((float) percentile / 65535.0f) * (floatMax-floatMin);
 
 1202         if (outFloat<floatMin)
 
 1204         else if (outFloat>floatMax)
 
 1212     if (writeToBitstream)
 
 1215         return ReadFloat16(inOutFloat, floatMin, floatMax);
 
 1221     if (inOutFloat>floatMax+.001)
 
 1225     if (inOutFloat<floatMin-.001)
 
 1229     float percentile=65535.0f * (inOutFloat-floatMin)/(floatMax-floatMin);
 
 1232     if (percentile>65535.0f)
 
 1233         percentile=65535.0f;
 
 1234     Write((
unsigned short)percentile);