diff options
-rw-r--r-- | sky/rnc_deco.cpp | 39 |
1 files changed, 17 insertions, 22 deletions
diff --git a/sky/rnc_deco.cpp b/sky/rnc_deco.cpp index 541ba6f93f..74339347c9 100644 --- a/sky/rnc_deco.cpp +++ b/sky/rnc_deco.cpp @@ -248,13 +248,14 @@ int32 RncDecoder::unpackM1(void *input, void *output, uint16 key) counts = inputBits(16); - for (;;) { - uint32 inputBytes = inputValue(_rawTable); - - if (inputBytes) { - memcpy(_dstPtr, _srcPtr, inputBytes); //memcpy is allowed here - _dstPtr += inputBytes; - _srcPtr += inputBytes; + do { + uint32 inputLength = inputValue(_rawTable); + uint32 inputOffset; + + if (inputLength) { + memcpy(_dstPtr, _srcPtr, inputLength); //memcpy is allowed here + _dstPtr += inputLength; + _srcPtr += inputLength; uint16 b = READ_LE_UINT16(_srcPtr); uint16 a = ROL(b, _bitCount); uint16 d = ((1 << _bitCount) - 1); @@ -269,22 +270,16 @@ int32 RncDecoder::unpackM1(void *input, void *output, uint16 key) _bitBuffh = a; } - if (--counts) { - uint32 inputOffset = inputValue(_posTable) + 1; - uint32 inputLength = inputValue(_lenTable) + MIN_LENGTH; - - inputHigh = _srcPtr; - _srcPtr = (_dstPtr-inputOffset); - - //Don't use memcpy here! because input and output overlap + if (counts > 1) { + inputOffset = inputValue(_posTable) + 1; + inputLength = inputValue(_lenTable) + MIN_LENGTH; + + // Don't use memcpy here! because input and output overlap. + uint8 *tmpPtr = (_dstPtr-inputOffset); while (inputLength--) - *_dstPtr++ = *_srcPtr++; - - _srcPtr = inputHigh; - } else - break; - - } + *_dstPtr++ = *tmpPtr++; + } + } while (--counts); } while (--blocks); if (CHECKSUMS) { |