InWindow.java 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // LZ.InWindow
  2. package SevenZip.Compression.LZ;
  3. import java.io.IOException;
  4. public class InWindow
  5. {
  6. public byte[] _bufferBase; // pointer to buffer with data
  7. java.io.InputStream _stream;
  8. int _posLimit; // offset (from _buffer) of first byte when new block reading must be done
  9. boolean _streamEndWasReached; // if (true) then _streamPos shows real end of stream
  10. int _pointerToLastSafePosition;
  11. public int _bufferOffset;
  12. public int _blockSize; // Size of Allocated memory block
  13. public int _pos; // offset (from _buffer) of curent byte
  14. int _keepSizeBefore; // how many BYTEs must be kept in buffer before _pos
  15. int _keepSizeAfter; // how many BYTEs must be kept buffer after _pos
  16. public int _streamPos; // offset (from _buffer) of first not read byte from Stream
  17. public void MoveBlock()
  18. {
  19. int offset = _bufferOffset + _pos - _keepSizeBefore;
  20. // we need one additional byte, since MovePos moves on 1 byte.
  21. if (offset > 0)
  22. offset--;
  23. int numBytes = _bufferOffset + _streamPos - offset;
  24. // check negative offset ????
  25. for (int i = 0; i < numBytes; i++)
  26. _bufferBase[i] = _bufferBase[offset + i];
  27. _bufferOffset -= offset;
  28. }
  29. public void ReadBlock() throws IOException
  30. {
  31. if (_streamEndWasReached)
  32. return;
  33. while (true)
  34. {
  35. int size = (0 - _bufferOffset) + _blockSize - _streamPos;
  36. if (size == 0)
  37. return;
  38. int numReadBytes = _stream.read(_bufferBase, _bufferOffset + _streamPos, size);
  39. if (numReadBytes == -1)
  40. {
  41. _posLimit = _streamPos;
  42. int pointerToPostion = _bufferOffset + _posLimit;
  43. if (pointerToPostion > _pointerToLastSafePosition)
  44. _posLimit = _pointerToLastSafePosition - _bufferOffset;
  45. _streamEndWasReached = true;
  46. return;
  47. }
  48. _streamPos += numReadBytes;
  49. if (_streamPos >= _pos + _keepSizeAfter)
  50. _posLimit = _streamPos - _keepSizeAfter;
  51. }
  52. }
  53. void Free() { _bufferBase = null; }
  54. public void Create(int keepSizeBefore, int keepSizeAfter, int keepSizeReserv)
  55. {
  56. _keepSizeBefore = keepSizeBefore;
  57. _keepSizeAfter = keepSizeAfter;
  58. int blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv;
  59. if (_bufferBase == null || _blockSize != blockSize)
  60. {
  61. Free();
  62. _blockSize = blockSize;
  63. _bufferBase = new byte[_blockSize];
  64. }
  65. _pointerToLastSafePosition = _blockSize - keepSizeAfter;
  66. }
  67. public void SetStream(java.io.InputStream stream) { _stream = stream; }
  68. public void ReleaseStream() { _stream = null; }
  69. public void Init() throws IOException
  70. {
  71. _bufferOffset = 0;
  72. _pos = 0;
  73. _streamPos = 0;
  74. _streamEndWasReached = false;
  75. ReadBlock();
  76. }
  77. public void MovePos() throws IOException
  78. {
  79. _pos++;
  80. if (_pos > _posLimit)
  81. {
  82. int pointerToPostion = _bufferOffset + _pos;
  83. if (pointerToPostion > _pointerToLastSafePosition)
  84. MoveBlock();
  85. ReadBlock();
  86. }
  87. }
  88. public byte GetIndexByte(int index) { return _bufferBase[_bufferOffset + _pos + index]; }
  89. // index + limit have not to exceed _keepSizeAfter;
  90. public int GetMatchLen(int index, int distance, int limit)
  91. {
  92. if (_streamEndWasReached)
  93. if ((_pos + index) + limit > _streamPos)
  94. limit = _streamPos - (_pos + index);
  95. distance++;
  96. // Byte *pby = _buffer + (size_t)_pos + index;
  97. int pby = _bufferOffset + _pos + index;
  98. int i;
  99. for (i = 0; i < limit && _bufferBase[pby + i] == _bufferBase[pby + i - distance]; i++);
  100. return i;
  101. }
  102. public int GetNumAvailableBytes() { return _streamPos - _pos; }
  103. public void ReduceOffsets(int subValue)
  104. {
  105. _bufferOffset += subValue;
  106. _posLimit -= subValue;
  107. _pos -= subValue;
  108. _streamPos -= subValue;
  109. }
  110. }