string ExtractFilePath(const string &Path) { size_t p; if (!FindLastSlash(p, Path)) p = 0; size_t PathRootLen = GetPathRootLength(Path); if (p <= PathRootLen && PathRootLen) return string(Path.CPtr(), PathRootLen).Append(L'\\'); return string(Path.CPtr(), p); }
bool ExtractIfExistCommand(string &strCommandText) { bool Result=true; const wchar_t *wPtrCmd=PrepareOSIfExist(strCommandText); // Во! Условие не выполнено!!! // (например, пока рассматривали менюху, в это время) // какой-то злобный чебурашка стер файл! if (wPtrCmd) { if (!*wPtrCmd) { Result=false; } else { size_t offset = wPtrCmd-strCommandText.CPtr(); wchar_t *CommandText = strCommandText.GetBuffer(); wchar_t *PtrCmd = CommandText+offset; // прокинем "if exist" wmemmove(CommandText+(*CommandText==L'@'?1:0),PtrCmd,StrLength(PtrCmd)+1); strCommandText.ReleaseBuffer(); } } return Result; }
string ExtractPathRoot(const string &Path) { size_t PathRootLen = GetPathRootLength(Path); if (PathRootLen) return string(Path.CPtr(), PathRootLen).Append(L'\\'); else return string(); }
string& WINAPI RemoveLeadingSpaces(string &strStr) { const wchar_t *ChPtr = strStr; for (; IsSpace(*ChPtr) || IsEol(*ChPtr); ChPtr++) ; strStr.Remove(0,ChPtr-strStr.CPtr()); return strStr; }
string ReplaceBrackets(const string& SearchStr,const string& ReplaceStr,RegExpMatch* Match,int Count) { string result; size_t pos=0,length=ReplaceStr.GetLength(); while (pos<length) { bool common=true; if (ReplaceStr[pos]=='$') { ++pos; if (pos>length) break; wchar_t symbol=Upper(ReplaceStr[pos]); int index=-1; if (symbol>='0'&&symbol<='9') { index=symbol-'0'; } else if (symbol>='A'&&symbol<='Z') { index=symbol-'A'+10; } if (index>=0) { if (index<Count) { string bracket(SearchStr.CPtr()+Match[index].start,Match[index].end-Match[index].start); result+=bracket; } common=false; } } if (common) { result+=ReplaceStr[pos]; } ++pos; } return result; }
string ExtractFileName(const string &Path) { size_t p; if (FindLastSlash(p, Path)) p++; else p = 0; size_t PathRootLen = GetPathRootLength(Path); if (p <= PathRootLen && PathRootLen) return string(); return string(Path.CPtr() + p, Path.GetLength() - p); }
int PrepareHotKey(string &strHotKey) { int FuncNum=0; if (strHotKey.GetLength() > 1) { // если хоткей больше 1 символа, считаем это случаем "F?", причем при кривизне всегда будет "F1" FuncNum=_wtoi(strHotKey.CPtr()+1); if (FuncNum < 1 || FuncNum > 24) { FuncNum=1; strHotKey=L"F1"; } } else { // при наличии "&" продублируем if (strHotKey.At(0) == L'&') strHotKey += L"&"; } return FuncNum; }
const wchar_t *GetPtrTitle() { return strTitle.CPtr(); }
inline const wchar_t* WordDiv(void) {return strWordDiv->CPtr();};
bool ScanTree::GetNextName(FAR_FIND_DATA_EX *fdata,string &strFullName) { if (!ScanItems.getCount()) return false; bool Done=false; Flags.Clear(FSCANTREE_SECONDDIRNAME); for (;;) { ScanTreeData* LastItem = ScanItems.lastItem(); if (!LastItem->Find) { LastItem->Find = new FindFile(strFindPath); } Done=!LastItem->Find->Get(*fdata); if (Flags.Check(FSCANTREE_FILESFIRST)) { if (LastItem->Flags.Check(FSCANTREE_SECONDPASS)) { if (!Done && !(fdata->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) continue; } else { if (!Done && (fdata->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) continue; if (Done) { if(LastItem->Find) { delete LastItem->Find; LastItem->Find = nullptr; } LastItem->Flags.Set(FSCANTREE_SECONDPASS); continue; } } } break; } if (Done) { ScanItems.deleteItem(ScanItems.getCount()-1); if (!ScanItems.getCount()) return false; else { if (ScanItems.lastItem()->Flags.Check(FSCANTREE_INSIDEJUNCTION)) Flags.Clear(FSCANTREE_INSIDEJUNCTION); CutToSlash(strFindPath,true); if (Flags.Check(FSCANTREE_RETUPDIR)) { strFullName = strFindPath; apiGetFindDataEx(strFullName, *fdata); } CutToSlash(strFindPath); strFindPath += strFindMask; _SVS(SysLog(L"1. FullName='%s'",strFullName.CPtr())); if (Flags.Check(FSCANTREE_RETUPDIR)) { Flags.Set(FSCANTREE_SECONDDIRNAME); return true; } return GetNextName(fdata,strFullName); } } else { if ((fdata->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) && Flags.Check(FSCANTREE_RECUR) && (!(fdata->dwFileAttributes&FILE_ATTRIBUTE_REPARSE_POINT) || Flags.Check(FSCANTREE_SCANSYMLINK))) { string RealPath(ScanItems.lastItem()->RealPath); AddEndSlash(RealPath); RealPath += fdata->strFileName; if (fdata->dwFileAttributes&FILE_ATTRIBUTE_REPARSE_POINT) ConvertNameToReal(RealPath, RealPath); //recursive symlinks guard bool Recursion = false; for (size_t i = 0; i < ScanItems.getCount() && !Recursion; i++) Recursion = ScanItems.getItem(i)->RealPath == RealPath; if (!Recursion) { CutToSlash(strFindPath); strFindPath += fdata->strFileName; strFullName = strFindPath; strFindPath += L"\\"; strFindPath += strFindMask; ScanItems.addItem(); ScanItems.lastItem()->Flags = ScanItems.getItem(ScanItems.getCount()-2)->Flags; // наследуем флаг ScanItems.lastItem()->Flags.Clear(FSCANTREE_SECONDPASS); ScanItems.lastItem()->RealPath = RealPath; if (fdata->dwFileAttributes&FILE_ATTRIBUTE_REPARSE_POINT) { ScanItems.lastItem()->Flags.Set(FSCANTREE_INSIDEJUNCTION); Flags.Set(FSCANTREE_INSIDEJUNCTION); } return true; } } } strFullName = strFindPath; CutToSlash(strFullName); strFullName += fdata->strFileName; return true; }
bool StrToGuid(const string& Value,GUID& Guid) { return (UuidFromString((unsigned short*)Value.CPtr(),&Guid)==RPC_S_OK)?true:false; }
const wchar_t *GetPluginData() {return strPluginData.CPtr();}