void pelet::UCharBufferedFileClass::Close() {
	CleanupBuffer();
	if (NULL != File) {
		u_fclose(File);
		File = NULL;
	}
	Buffer = NULL;
	Eof = NULL;
	File = NULL;
	BufferCapacity = 0;
	CharacterPos = 0;
	HasReachedEof = false;
	
	Current = NULL;
	TokenStart = NULL;
	Marker = NULL;
	Limit = NULL;
}
Exemple #2
0
void SaveScreen::Resize(int NewX,int NewY, DWORD Corner, bool SyncWithConsole)
//  Corner definition:
//  0 --- 1
//  |     |
//  2 --- 3
{
	const auto OWi = width();
	const auto OHe = height();
	int iY = 0;

	if (OWi==NewX && OHe==NewY)
	{
		return;
	}

	int NX1 = 0, NX2 = 0, NY1 = 0, NY2 = 0;
	matrix<FAR_CHAR_INFO> NewBuf(NewY, NewX);
	CleanupBuffer(NewBuf.data(), NewBuf.size());
	const auto NewWidth = std::min(OWi, NewX);
	const auto NewHeight = std::min(OHe, NewY);
	int iYReal;
	int ToIndex=0;
	int FromIndex=0;

	if (Corner & 2)
	{
		NY2 = m_Y1 + NewY - 1; NY1 = NY2 - NewY + 1;
	}
	else
	{
		NY1 = m_Y1; NY2 = NY1 + NewY - 1;
	}

	if (Corner & 1)
	{
		NX2 = m_X1 + NewX - 1; NX1 = NX2 - NewX + 1;
	}
	else
	{
		NX1 = m_X1; NX2 = NX1 + NewX - 1;
	}

	for (iY=0; iY<NewHeight; iY++)
	{
		if (Corner & 2)
		{
			if (OHe>NewY)
			{
				iYReal=OHe-NewY+iY;
				FromIndex=iYReal*OWi;
				ToIndex=iY*NewX;
			}
			else
			{
				iYReal=NewY-OHe+iY;
				ToIndex=iYReal*NewX;
				FromIndex=iY*OWi;
			}
		}

		if (Corner & 1)
		{
			if (OWi>NewX)
			{
				FromIndex+=OWi-NewX;
			}
			else
			{
				ToIndex+=NewX-OWi;
			}
		}

		std::copy_n(ScreenBuf.data() + FromIndex, NewWidth, NewBuf.data() + ToIndex);
	}

	// achtung, experimental
	if((Corner&2) && SyncWithConsole)
	{
		Console().ResetPosition();
		if(NewY!=OHe)
		{
			matrix<FAR_CHAR_INFO> Tmp(abs(OHe - NewY), std::max(NewX, OWi));
			if(NewY>OHe)
			{
				SMALL_RECT ReadRegion={0, 0, static_cast<SHORT>(NewX-1), static_cast<SHORT>(NewY-OHe-1)};
				Console().ReadOutput(Tmp, ReadRegion);
				for(size_t i = 0; i != Tmp.height(); ++i)
				{
					std::copy_n(Tmp[i].data(), Tmp.width(), NewBuf[i].data());
				}
			}
			else
			{
				SMALL_RECT WriteRegion={0, static_cast<SHORT>(NewY-OHe), static_cast<SHORT>(NewX-1), -1};
				for(size_t i = 0; i != Tmp.height(); ++i)
				{
					std::copy_n(ScreenBuf[i].data(), Tmp.width(), Tmp[i].data());
				}
				Console().WriteOutput(Tmp, WriteRegion);
				Console().Commit();
			}
		}

		if(NewX!=OWi)
		{
			matrix<FAR_CHAR_INFO> Tmp(std::max(NewY, OHe), abs(NewX - OWi));
			if(NewX>OWi)
			{
				SMALL_RECT ReadRegion={static_cast<SHORT>(OWi), 0, static_cast<SHORT>(NewX-1), static_cast<SHORT>(NewY-1)};
				Console().ReadOutput(Tmp, ReadRegion);
				for(size_t i = 0; i != NewBuf.height(); ++i)
				{
					std::copy_n(Tmp[i].data(), Tmp.width(), &NewBuf[i][OWi]);
				}
			}
			else
			{
				SMALL_RECT WriteRegion={static_cast<SHORT>(NewX), static_cast<SHORT>(NewY-OHe), static_cast<SHORT>(OWi-1), static_cast<SHORT>(NewY-1)};
				for(size_t i = 0; i != Tmp.height(); ++i)
				{
					if (static_cast<int>(i) < OHe)
						std::copy_n(&ScreenBuf[i][NewX], Tmp.width(), Tmp[i].data());
					else
						CleanupBuffer(Tmp[i].data(), Tmp.width());
				}
				Console().WriteOutput(Tmp, WriteRegion);
				Console().Commit();
			}
		}
	}

	ScreenBuf.swap(NewBuf);
	m_X1 = NX1; m_Y1 = NY1; m_X2 = NX2; m_Y2 = NY2;
}
Exemple #3
0
void SaveScreen::Resize(int NewX,int NewY, DWORD Corner, bool SyncWithConsole)
//  Corner definition:
//  0 --- 1
//  |     |
//  2 --- 3
{
	int OWi=X2-X1+1, OHe=Y2-Y1+1, iY=0;

	if (OWi==NewX && OHe==NewY)
	{
		return;
	}

	int NX1,NX2,NY1,NY2;
	NX1=NX2=NY1=NY2=0;
	std::vector<FAR_CHAR_INFO> NewBuf(NewX * NewY);
	CleanupBuffer(NewBuf.data(), NewBuf.size());
	int NewWidth=std::min(OWi,NewX);
	int NewHeight=std::min(OHe,NewY);
	int iYReal;
	int ToIndex=0;
	int FromIndex=0;

	if (Corner & 2)
	{
		NY2=Y1+NewY-1; NY1=NY2-NewY+1;
	}
	else
	{
		NY1=Y1; NY2=NY1+NewY-1;
	}

	if (Corner & 1)
	{
		NX2=X1+NewX-1; NX1=NX2-NewX+1;
	}
	else
	{
		NX1=X1; NX2=NX1+NewX-1;
	}

	for (iY=0; iY<NewHeight; iY++)
	{
		if (Corner & 2)
		{
			if (OHe>NewY)
			{
				iYReal=OHe-NewY+iY;
				FromIndex=iYReal*OWi;
				ToIndex=iY*NewX;
			}
			else
			{
				iYReal=NewY-OHe+iY;
				ToIndex=iYReal*NewX;
				FromIndex=iY*OWi;
			}
		}

		if (Corner & 1)
		{
			if (OWi>NewX)
			{
				FromIndex+=OWi-NewX;
			}
			else
			{
				ToIndex+=NewX-OWi;
			}
		}

		CharCopy(&NewBuf[ToIndex], &ScreenBuf[FromIndex], NewWidth);
	}

	// achtung, experimental
	if((Corner&2) && SyncWithConsole)
	{
		Global->Console->ResetPosition();
		if(NewY!=OHe)
		{
			COORD Size={static_cast<SHORT>(std::max(NewX,OWi)), static_cast<SHORT>(abs(OHe-NewY))};
			COORD Coord={};
			std::vector<FAR_CHAR_INFO> Tmp(Size.X * Size.Y);
			if(NewY>OHe)
			{
				SMALL_RECT ReadRegion={0, 0, static_cast<SHORT>(NewX-1), static_cast<SHORT>(NewY-OHe-1)};
				Global->Console->ReadOutput(Tmp.data(), Size, Coord, ReadRegion);
				for(int i=0; i<Size.Y;i++)
				{
					CharCopy(&NewBuf[i*Size.X], &Tmp[i*Size.X], Size.X);
				}
			}
			else
			{
				SMALL_RECT WriteRegion={0, static_cast<SHORT>(NewY-OHe), static_cast<SHORT>(NewX-1), -1};
				for(int i=0; i<Size.Y;i++)
				{
					CharCopy(&Tmp[i*Size.X], &ScreenBuf[i*OWi], Size.X);
				}
				Global->Console->WriteOutput(Tmp.data(), Size, Coord, WriteRegion);
				Global->Console->Commit();
			}
		}

		if(NewX!=OWi)
		{
			COORD Size={static_cast<SHORT>(abs(NewX-OWi)), static_cast<SHORT>(std::max(NewY,OHe))};
			COORD Coord={};
			std::vector<FAR_CHAR_INFO> Tmp(Size.X * Size.Y);
			if(NewX>OWi)
			{
				SMALL_RECT ReadRegion={static_cast<SHORT>(OWi), 0, static_cast<SHORT>(NewX-1), static_cast<SHORT>(NewY-1)};
				Global->Console->ReadOutput(Tmp.data(), Size, Coord, ReadRegion);
				for(int i=0; i<NewY;i++)
				{
					CharCopy(&NewBuf[i*NewX+OWi], &Tmp[i*Size.X], Size.X);
				}
			}
			else
			{
				SMALL_RECT WriteRegion={static_cast<SHORT>(NewX), static_cast<SHORT>(NewY-OHe), static_cast<SHORT>(OWi-1), static_cast<SHORT>(NewY-1)};
				for(int i=0; i<Size.Y;i++)
				{
					if (i < OHe)
						CharCopy(&Tmp[i*Size.X], &ScreenBuf[i*OWi+NewX], Size.X);
					else
						CleanupBuffer(&Tmp[i*Size.X], Size.X);
				}
				Global->Console->WriteOutput(Tmp.data(), Size, Coord, WriteRegion);
				Global->Console->Commit();
			}
		}
	}

	ScreenBuf.swap(NewBuf);
	X1=NX1; Y1=NY1; X2=NX2; Y2=NY2;
}