misc/libphysfs/lzma/CPP/7zip/Compress/LZ/LZOutWindow.h
author nemo
Mon, 10 Apr 2017 12:06:43 -0400
changeset 12218 bb5522e88ab2
permissions -rw-r--r--
bulk copy of latest physfs to our misc/libphysfs since this seems to fix an off-by-1 error reliably hit in readln read of 1 byte probably introduced in the addition of the buffered read. Whether this is excessive or whether libphysfs should even be maintained by us is another matter. But at least we shouldn't crash

// LZOutWindow.h

#ifndef __LZ_OUT_WINDOW_H
#define __LZ_OUT_WINDOW_H

#include "../../IStream.h"
#include "../../Common/OutBuffer.h"

#ifndef _NO_EXCEPTIONS
typedef COutBufferException CLZOutWindowException;
#endif

class CLZOutWindow: public COutBuffer
{
public:
  void Init(bool solid = false);
  
  // distance >= 0, len > 0, 
  bool CopyBlock(UInt32 distance, UInt32 len)
  {
    UInt32 pos = _pos - distance - 1;
    if (distance >= _pos)
    {
      if (!_overDict || distance >= _bufferSize)
        return false;
      pos += _bufferSize;
    }
    if (_limitPos - _pos > len && _bufferSize - pos > len)
    {
      const Byte *src = _buffer + pos;
      Byte *dest = _buffer + _pos;
      _pos += len;
      do
        *dest++ = *src++;
      while(--len != 0);
    }
    else do
    {
      if (pos == _bufferSize)
        pos = 0;
      _buffer[_pos++] = _buffer[pos++];
      if (_pos == _limitPos)
        FlushWithCheck();  
    }
    while(--len != 0);
    return true;
  }
  
  void PutByte(Byte b)
  {
    _buffer[_pos++] = b;
    if (_pos == _limitPos)
      FlushWithCheck();  
  }
  
  Byte GetByte(UInt32 distance) const
  {
    UInt32 pos = _pos - distance - 1;
    if (pos >= _bufferSize)
      pos += _bufferSize;
    return _buffer[pos]; 
  }
};

#endif