示例#1
0
	std::set<string>& GetComponentsInfo()
	{
		static FN_RETURN_TYPE(GetComponentsInfo) sList;
		if (sList.empty())
		{
			auto& ComponentsList = GetComponentsList();
			std::transform(ALL_RANGE(ComponentsList), std::inserter(sList, sList.end()), [](CONST_REFERENCE(ComponentsList) i)
			{
				return i();
			});
示例#2
0
void ScreenBuf::DebugDump() const
{
#ifdef _DEBUG
	string s(Buf.width() + 1, L' ');
	s.back() = L'\n';

	for (size_t row_num = 0; row_num != Buf.height(); ++row_num)
	{
		const auto&& row = Buf[row_num];
		std::transform(ALL_CONST_RANGE(row), s.begin(), [](CONST_REFERENCE(row) i) { return i.Char; });
		OutputDebugString(s.data());
	}
示例#3
0
bool DizList::Flush(const string& Path,const string* DizName)
{
	if (!Modified)
		return true;

	if (DizName)
	{
		strDizFileName = *DizName;
	}
	else if (strDizFileName.empty())
	{
		if (DizData.empty() || Path.empty())
			return false;

		strDizFileName = Path;
		AddEndSlash(strDizFileName);
		string strArgName;
		GetCommaWord(Global->Opt->Diz.strListNames.data(),strArgName);
		strDizFileName += strArgName;
	}

	DWORD FileAttr=os::GetFileAttributes(strDizFileName);

	if (FileAttr != INVALID_FILE_ATTRIBUTES)
	{
		if (FileAttr&FILE_ATTRIBUTE_READONLY)
		{
			if(Global->Opt->Diz.ROUpdate)
			{
				if(os::SetFileAttributes(strDizFileName,FileAttr))
				{
					FileAttr^=FILE_ATTRIBUTE_READONLY;
				}
			}
		}

		if(!(FileAttr&FILE_ATTRIBUTE_READONLY))
		{
			os::SetFileAttributes(strDizFileName,FILE_ATTRIBUTE_ARCHIVE);
		}
		else
		{
			Message(MSG_WARNING,1,MSG(MError),MSG(MCannotUpdateDiz),MSG(MCannotUpdateRODiz),MSG(MOk));
			return false;
		}
	}

	os::fs::file DizFile;

	bool AnyError=false;

	bool EmptyDiz=true;
	// Don't use CreationDisposition=CREATE_ALWAYS here - it's kills alternate streams
	if(!DizData.empty() && DizFile.Open(strDizFileName, GENERIC_WRITE, FILE_SHARE_READ, nullptr, FileAttr==INVALID_FILE_ATTRIBUTES?CREATE_NEW:TRUNCATE_EXISTING))
	{
		uintptr_t CodePage = Global->Opt->Diz.SaveInUTF ? CP_UTF8 : (Global->Opt->Diz.AnsiByDefault ? CP_ACP : CP_OEMCP);

		CachedWrite Cache(DizFile);

		if (CodePage == CP_UTF8)
		{
			DWORD dwSignature = SIGN_UTF8;
			if(!Cache.Write(&dwSignature, 3))
			{
				AnyError=true;
			}
		}

		if(!AnyError)
		{
			FOR(const auto& i, DizData)
			{
				string dump = i.first;
				QuoteSpaceOnly(dump);
				dump += i.second.front();
				if(i.second.size() > 1)
				{
					auto start = i.second.cbegin();
					++start;
					std::for_each(start, i.second.cend(), [&](CONST_REFERENCE(i.second) j)
					{
						dump.append(L"\r\n ").append(j);
					});
virtual bool ReadOutput(matrix<FAR_CHAR_INFO>& Buffer, COORD BufferCoord, SMALL_RECT& ReadRegion) const override
{
	bool Result=false;
	int Delta=Global->Opt->WindowMode?GetDelta():0;
	ReadRegion.Top+=Delta;
	ReadRegion.Bottom+=Delta;

	COORD BufferSize = { static_cast<SHORT>(Buffer.width()), static_cast<SHORT>(Buffer.height()) };

	// skip unused region
	const size_t Offset = BufferCoord.Y * BufferSize.X;
	matrix<CHAR_INFO> ConsoleBuffer(BufferSize.Y - BufferCoord.Y, BufferSize.X);
	
	BufferSize.Y-=BufferCoord.Y;
	BufferCoord.Y=0;

	if(BufferSize.X*BufferSize.Y*sizeof(CHAR_INFO)>MAXSIZE)
	{
		auto SavedY = BufferSize.Y;
		BufferSize.Y = std::max(static_cast<int>(MAXSIZE/(BufferSize.X*sizeof(CHAR_INFO))),1);
		size_t Height = ReadRegion.Bottom - ReadRegion.Top + 1;
		int Start=ReadRegion.Top;
		SMALL_RECT SavedReadRegion=ReadRegion;
		for(size_t i = 0; i < Height; i += BufferSize.Y)
		{
			ReadRegion=SavedReadRegion;
			ReadRegion.Top = static_cast<SHORT>(Start+i);
			Result = ReadConsoleOutput(GetOutputHandle(), ConsoleBuffer[i].data(), BufferSize, BufferCoord, &ReadRegion) != FALSE;
		}
		BufferSize.Y = SavedY;
	}
	else
	{
		Result=ReadConsoleOutput(GetOutputHandle(), ConsoleBuffer.data(), BufferSize, BufferCoord, &ReadRegion)!=FALSE;
	}

	auto& ConsoleBufferVector = ConsoleBuffer.vector();
	std::transform(ConsoleBufferVector.cbegin(), ConsoleBufferVector.cend(), Buffer.data() + Offset, [](CONST_REFERENCE(ConsoleBufferVector) i)
	{
		return FAR_CHAR_INFO::make(i.Char.UnicodeChar, colors::ConsoleColorToFarColor(i.Attributes));
	});