in csharp/src/BitStream.cs [322:378]
public static size_t InitDStream(BIT_DStream_t bitD, void* srcBuffer, size_t srcSize)
{
if (srcSize < 1)
{
bitD.Reset(); return ERROR(Error.srcSize_wrong);
}
bitD.start = (sbyte*)srcBuffer;
bitD.limitPtr = bitD.start + sizeOfBitContainer;
if (srcSize >= sizeOfBitContainer)
{ /* normal case */
bitD.ptr = (sbyte*)srcBuffer + srcSize - sizeOfBitContainer;
bitD.bitContainer = MEM_readLEST(bitD.ptr);
{
BYTE lastByte = ((BYTE*)srcBuffer)[srcSize - 1];
bitD.bitsConsumed = lastByte != 0 ? 8 - BIT_highbit32(lastByte) : 0; /* ensures bitsConsumed is always set */
if (lastByte == 0) return ERROR(Error.GENERIC); /* endMark not present */
}
}
else
{
bitD.ptr = bitD.start;
bitD.bitContainer = *(BYTE*)(bitD.start);
{
if (srcSize >= 7) bitD.bitContainer += (size_t)(((BYTE*)(srcBuffer))[6]) << (int)(sizeOfBitContainer * 8 - 16);
/* fall-through */
if (srcSize >= 6) bitD.bitContainer += (size_t)(((BYTE*)(srcBuffer))[5]) << (int)(sizeOfBitContainer * 8 - 24);
/* fall-through */
if (srcSize >= 5) bitD.bitContainer += (size_t)(((BYTE*)(srcBuffer))[4]) << (int)(sizeOfBitContainer * 8 - 32);
/* fall-through */
if (srcSize >= 4) bitD.bitContainer += (size_t)(((BYTE*)(srcBuffer))[3]) << 24;
/* fall-through */
if (srcSize >= 3) bitD.bitContainer += (size_t)(((BYTE*)(srcBuffer))[2]) << 16;
/* fall-through */
if (srcSize >= 2) bitD.bitContainer += (size_t)(((BYTE*)(srcBuffer))[1]) << 8;
/* fall-through */
/*default: break;*/
}
{
BYTE lastByte = ((BYTE*)srcBuffer)[srcSize - 1];
bitD.bitsConsumed = lastByte != 0 ? 8 - BIT_highbit32(lastByte) : 0;
if (lastByte == 0) return ERROR(Error.corruption_detected); /* endMark not present */
}
bitD.bitsConsumed += (U32)(sizeOfBitContainer - srcSize) * 8;
}
return srcSize;
}