"Fossies" - the Fresh Open Source Software Archive

Member "UXP-2019.06.08/other-licenses/7zstub/src/CPP/7zip/Common/OutBuffer.cpp" (8 Jun 2019, 2168 Bytes) of package /linux/www/UXP-2019.06.08.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 // OutBuffer.cpp
    2 
    3 #include "StdAfx.h"
    4 
    5 #include "../../../C/Alloc.h"
    6 
    7 #include "OutBuffer.h"
    8 
    9 bool COutBuffer::Create(UInt32 bufSize) throw()
   10 {
   11   const UInt32 kMinBlockSize = 1;
   12   if (bufSize < kMinBlockSize)
   13     bufSize = kMinBlockSize;
   14   if (_buf != 0 && _bufSize == bufSize)
   15     return true;
   16   Free();
   17   _bufSize = bufSize;
   18   _buf = (Byte *)::MidAlloc(bufSize);
   19   return (_buf != 0);
   20 }
   21 
   22 void COutBuffer::Free() throw()
   23 {
   24   ::MidFree(_buf);
   25   _buf = 0;
   26 }
   27 
   28 void COutBuffer::Init() throw()
   29 {
   30   _streamPos = 0;
   31   _limitPos = _bufSize;
   32   _pos = 0;
   33   _processedSize = 0;
   34   _overDict = false;
   35   #ifdef _NO_EXCEPTIONS
   36   ErrorCode = S_OK;
   37   #endif
   38 }
   39 
   40 UInt64 COutBuffer::GetProcessedSize() const throw()
   41 {
   42   UInt64 res = _processedSize + _pos - _streamPos;
   43   if (_streamPos > _pos)
   44     res += _bufSize;
   45   return res;
   46 }
   47 
   48 
   49 HRESULT COutBuffer::FlushPart() throw()
   50 {
   51   // _streamPos < _bufSize
   52   UInt32 size = (_streamPos >= _pos) ? (_bufSize - _streamPos) : (_pos - _streamPos);
   53   HRESULT result = S_OK;
   54   #ifdef _NO_EXCEPTIONS
   55   result = ErrorCode;
   56   #endif
   57   if (_buf2 != 0)
   58   {
   59     memcpy(_buf2, _buf + _streamPos, size);
   60     _buf2 += size;
   61   }
   62 
   63   if (_stream != 0
   64       #ifdef _NO_EXCEPTIONS
   65       && (ErrorCode == S_OK)
   66       #endif
   67      )
   68   {
   69     UInt32 processedSize = 0;
   70     result = _stream->Write(_buf + _streamPos, size, &processedSize);
   71     size = processedSize;
   72   }
   73   _streamPos += size;
   74   if (_streamPos == _bufSize)
   75     _streamPos = 0;
   76   if (_pos == _bufSize)
   77   {
   78     _overDict = true;
   79     _pos = 0;
   80   }
   81   _limitPos = (_streamPos > _pos) ? _streamPos : _bufSize;
   82   _processedSize += size;
   83   return result;
   84 }
   85 
   86 HRESULT COutBuffer::Flush() throw()
   87 {
   88   #ifdef _NO_EXCEPTIONS
   89   if (ErrorCode != S_OK)
   90     return ErrorCode;
   91   #endif
   92 
   93   while (_streamPos != _pos)
   94   {
   95     HRESULT result = FlushPart();
   96     if (result != S_OK)
   97       return result;
   98   }
   99   return S_OK;
  100 }
  101 
  102 void COutBuffer::FlushWithCheck()
  103 {
  104   HRESULT result = Flush();
  105   #ifdef _NO_EXCEPTIONS
  106   ErrorCode = result;
  107   #else
  108   if (result != S_OK)
  109     throw COutBufferException(result);
  110   #endif
  111 }