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(); });
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()); }
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)); });