void AppendStringToBuffer(BufferRef buffer, char * append) { BufferRef appendBuffer = CreateBufferRef(); IncrementBufferRefBySize(appendBuffer, strlen(append)-0x1); memcpy(appendBuffer->data, append, strlen(append)); AppendBufferToBuffer(buffer, appendBuffer); }
BufferRef CreateBufferFromBufferWithRange(BufferRef buffer, Range subRange) { BufferRef sub = CreateBufferRef(); IncrementBufferRefBySize(sub, subRange.length-0x1); memcpy(sub->data, &(buffer->data[subRange.offset]), subRange.length); return sub; }
owBuffer * owZip::RefCompress(owFile * _pFile, int32_t _nLevel) { _pFile->Seek( SEEK_SET, 0); if(_pFile->Eof()) { return NULL; } // 保证有充足的压缩空间 if(_pFile->Size() > m_pTempBuffer->Size()) { m_pTempBuffer->Resize( _pFile->Size()); } m_pTempBuffer->Seek( SEEK_SET, 0); int retCode; int flush; z_stream stream; stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; retCode = deflateInit( &stream, _nLevel); while( true ) { stream.avail_in = _pFile->Read( m_pInputChunkBuffer->GetBuffer(), m_pInputChunkBuffer->Size() ); stream.next_in = (Bytef*)m_pInputChunkBuffer->GetBuffer(); flush = _pFile->Eof()?Z_FINISH : Z_NO_FLUSH; while( stream.avail_in != 0 ) { stream.avail_out = (uint32_t)m_pOutputChunkBuffer->Size(); stream.next_out = (Bytef*)m_pOutputChunkBuffer->GetBuffer(); retCode = deflate( &stream, flush); assert(retCode != Z_STREAM_ERROR); int32_t chunkSize = m_pOutputChunkBuffer->Size() - stream.avail_out; // m_pTempBuffer 大小会自动增长 m_pTempBuffer->Write( m_pOutputChunkBuffer->GetBuffer(), chunkSize); } assert(stream.avail_in == 0); if(flush == Z_FINISH) { break; } } int32_t dataSize = m_pTempBuffer->GetCurr() - m_pTempBuffer->GetBuffer(); if(dataSize == 0) { return NULL; } else { owBuffer * pRet = CreateBufferRef( m_pTempBuffer->GetBuffer(), dataSize); return pRet; } return NULL; }