FragmentedWindow::FragmentedWindow() { memset(Mem,0,sizeof(Mem)); memset(MemSize,0,sizeof(MemSize)); } FragmentedWindow::~FragmentedWindow() { Reset(); } void FragmentedWindow::Reset() { for (uint I=0;I=MinSize) { NewMem=(byte *)malloc(Size); if (NewMem!=NULL) break; Size-=Size/32; } if (NewMem == NULL) { #if defined(UNRAR_NO_EXCEPTIONS) base::TerminateBecauseOutOfMemory(Size); #else throw std::bad_alloc(); #endif // defined(UNRAR_NO_EXCEPTIONS) } // Clean the window to generate the same output when unpacking corrupt // RAR files, which may access to unused areas of sliding dictionary. memset(NewMem,0,Size); Mem[BlockNum]=NewMem; TotalSize+=Size; MemSize[BlockNum]=TotalSize; BlockNum++; } if (TotalSize < WinSize) // Not found enough free blocks. { #if defined(UNRAR_NO_EXCEPTIONS) base::TerminateBecauseOutOfMemory(WinSize); #else throw std::bad_alloc(); #endif // defined(UNRAR_NO_EXCEPTIONS) } } byte& FragmentedWindow::operator [](size_t Item) { if (Item 0) { (*this)[UnpPtr]=(*this)[SrcPtr++ & MaxWinMask]; // We need to have masked UnpPtr after quit from loop, so it must not // be replaced with '(*this)[UnpPtr++ & MaxWinMask]' UnpPtr=(UnpPtr+1) & MaxWinMask; } } void FragmentedWindow::CopyData(byte *Dest,size_t WinPos,size_t Size) { for (size_t I=0;I