hackedteam/vector-edk

View on GitHub
vector-uefi/insyde/7zip/Java/SevenZip/Compression/LZ/OutWindow.java

Summary

Maintainability
A
25 mins
Test Coverage
// LZ.OutWindow

package SevenZip.Compression.LZ;

import java.io.IOException;

public class OutWindow
{
    byte[] _buffer;
    int _pos;
    int _windowSize = 0;
    int _streamPos;
    java.io.OutputStream _stream;
    
    public void Create(int windowSize)
    {
        if (_buffer == null || _windowSize != windowSize)
            _buffer = new byte[windowSize];
        _windowSize = windowSize;
        _pos = 0;
        _streamPos = 0;
    }
    
    public void SetStream(java.io.OutputStream stream) throws IOException
    {
        ReleaseStream();
        _stream = stream;
    }
    
    public void ReleaseStream() throws IOException
    {
        Flush();
        _stream = null;
    }
    
    public void Init(boolean solid)
    {
        if (!solid)
        {
            _streamPos = 0;
            _pos = 0;
        }
    }
    
    public void Flush() throws IOException
    {
        int size = _pos - _streamPos;
        if (size == 0)
            return;
        _stream.write(_buffer, _streamPos, size);
        if (_pos >= _windowSize)
            _pos = 0;
        _streamPos = _pos;
    }
    
    public void CopyBlock(int distance, int len) throws IOException
    {
        int pos = _pos - distance - 1;
        if (pos < 0)
            pos += _windowSize;
        for (; len != 0; len--)
        {
            if (pos >= _windowSize)
                pos = 0;
            _buffer[_pos++] = _buffer[pos++];
            if (_pos >= _windowSize)
                Flush();
        }
    }
    
    public void PutByte(byte b) throws IOException
    {
        _buffer[_pos++] = b;
        if (_pos >= _windowSize)
            Flush();
    }
    
    public byte GetByte(int distance)
    {
        int pos = _pos - distance - 1;
        if (pos < 0)
            pos += _windowSize;
        return _buffer[pos];
    }
}