diff options
Diffstat (limited to 'lib/UnrarXLib/coder.cpp')
-rw-r--r-- | lib/UnrarXLib/coder.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/UnrarXLib/coder.cpp b/lib/UnrarXLib/coder.cpp new file mode 100644 index 0000000000..d556f0e18c --- /dev/null +++ b/lib/UnrarXLib/coder.cpp @@ -0,0 +1,47 @@ + + +inline unsigned int RangeCoder::GetChar() +{ + return(UnpackRead->GetChar()); +} + + +void RangeCoder::InitDecoder(Unpack *UnpackRead) +{ + RangeCoder::UnpackRead=UnpackRead; + + low=code=0; + range=uint(-1); + for (int i=0;i < 4;i++) + code=(code << 8) | GetChar(); +} + + +#define ARI_DEC_NORMALIZE(code,low,range,read) \ +{ \ + while ((low^(low+range))<TOP || (range<BOT && ((range=-low&(BOT-1)),1))) \ + { \ + code=(code << 8) | read->GetChar(); \ + range <<= 8; \ + low <<= 8; \ + } \ +} + + +inline int RangeCoder::GetCurrentCount() +{ + return (code-low)/(range /= SubRange.scale); +} + + +inline uint RangeCoder::GetCurrentShiftCount(uint SHIFT) +{ + return (code-low)/(range >>= SHIFT); +} + + +inline void RangeCoder::Decode() +{ + low += range*SubRange.LowCount; + range *= SubRange.HighCount-SubRange.LowCount; +} |