BOOL AddEndSlash(string &strPath, wchar_t TypeSlash) { wchar_t *lpwszPath = strPath.GetBuffer(strPath.GetLength()+2); BOOL Result = AddEndSlash(lpwszPath, TypeSlash); strPath.ReleaseBuffer(); return Result; }
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& __stdcall TruncStrFromEnd(string &strStr, int MaxLength) { wchar_t *lpwszBuffer = strStr.GetBuffer(); TruncStrFromEnd(lpwszBuffer, MaxLength); strStr.ReleaseBuffer(); return strStr; }
string& __stdcall TruncPathStr(string &strStr, int MaxLength) { wchar_t *lpwszStr = strStr.GetBuffer(); TruncPathStr(lpwszStr, MaxLength); strStr.ReleaseBuffer(); return strStr; }
// Заменить в строке Str Count вхождений подстроки FindStr на подстроку ReplStr // Если Count < 0 - заменять "до полной победы" // Return - количество замен int ReplaceStrings(string &strStr,const wchar_t *FindStr,const wchar_t *ReplStr,int Count,BOOL IgnoreCase) { const int LenFindStr=StrLength(FindStr); if ( !LenFindStr || !Count ) return 0; const int LenReplStr=StrLength(ReplStr); size_t L=strStr.GetLength(); const int Delta = LenReplStr-LenFindStr; const int AllocDelta = Delta > 0 ? Delta*10 : 0; size_t I=0; int J=0; while (I+LenFindStr <= L) { int Res=IgnoreCase?StrCmpNI(&strStr[I], FindStr, LenFindStr):StrCmpN(&strStr[I], FindStr, LenFindStr); if (!Res) { wchar_t *Str; if (L+Delta+1 > strStr.GetSize()) Str = strStr.GetBuffer(L+AllocDelta); else Str = strStr.GetBuffer(); if (Delta > 0) wmemmove(Str+I+Delta,Str+I,L-I+1); else if (Delta < 0) wmemmove(Str+I,Str+I-Delta,L-I+Delta+1); wmemcpy(Str+I,ReplStr,LenReplStr); I += LenReplStr; L+=Delta; strStr.ReleaseBuffer(L); if (++J == Count && Count > 0) break; } else { I++; } } return J; }
void QuoteSpaceOnly(string& strSrc) { TCHAR* lpBuffer = strSrc.GetBuffer(strSrc.GetLength()+5); FSF.QuoteSpaceOnly(lpBuffer); strSrc.ReleaseBuffer(); }
void farTruncPathStr(string& strFileName, int nLength) { TCHAR* pBuffer = strFileName.GetBuffer(); FSF.TruncPathStr(pBuffer, nLength); strFileName.ReleaseBuffer(); }
void farTrim(string& strStr) { TCHAR* pBuffer = strStr.GetBuffer(); FSF.Trim(pBuffer); strStr.ReleaseBuffer(); }
void farUnquote(string& strStr) { TCHAR* pBuffer = strStr.GetBuffer(); FSF.Unquote(pBuffer); strStr.ReleaseBuffer(); }
void farQuoteSpaceOnly(string& strStr) { TCHAR* pBuffer = strStr.GetBuffer(strStr.GetLength()+2); FSF.QuoteSpaceOnly(pBuffer); strStr.ReleaseBuffer(); }
DWORD WINAPI GetReparsePointInfo(const wchar_t *Object, string &strDestBuff,LPDWORD lpReparseTag) { WORD NameLength=0; LPBYTE szBuff=new BYTE[MAXIMUM_REPARSE_DATA_BUFFER_SIZE]; if(szBuff) { PREPARSE_DATA_BUFFER rdb = reinterpret_cast<PREPARSE_DATA_BUFFER>(szBuff); if (GetREPARSE_DATA_BUFFER(Object,rdb)) { const wchar_t *PathBuffer; if (lpReparseTag) *lpReparseTag=rdb->ReparseTag; if (rdb->ReparseTag == IO_REPARSE_TAG_SYMLINK) { NameLength = rdb->SymbolicLinkReparseBuffer.PrintNameLength/sizeof(wchar_t); if (NameLength) { PathBuffer = &rdb->SymbolicLinkReparseBuffer.PathBuffer[rdb->SymbolicLinkReparseBuffer.PrintNameOffset/sizeof(wchar_t)]; } else { NameLength = rdb->SymbolicLinkReparseBuffer.SubstituteNameLength/sizeof(wchar_t); PathBuffer = &rdb->SymbolicLinkReparseBuffer.PathBuffer[rdb->SymbolicLinkReparseBuffer.SubstituteNameOffset/sizeof(wchar_t)]; } } else { NameLength = rdb->MountPointReparseBuffer.PrintNameLength/sizeof(wchar_t); if (NameLength) { PathBuffer = &rdb->MountPointReparseBuffer.PathBuffer[rdb->MountPointReparseBuffer.PrintNameOffset/sizeof(wchar_t)]; } else { NameLength = rdb->MountPointReparseBuffer.SubstituteNameLength/sizeof(wchar_t); PathBuffer = &rdb->MountPointReparseBuffer.PathBuffer[rdb->MountPointReparseBuffer.SubstituteNameOffset/sizeof(wchar_t)]; } } wchar_t *lpwszDestBuff=strDestBuff.GetBuffer(NameLength+1); wcsncpy(lpwszDestBuff,PathBuffer,NameLength); strDestBuff.ReleaseBuffer(NameLength); } delete[] szBuff; } return NameLength; }
void NormalizeSymlinkName(string &strLinkName) { if (!StrCmpN(strLinkName,L"\\??\\",4)) { LPWSTR LinkName=strLinkName.GetBuffer(); LinkName[1]=L'\\'; strLinkName.ReleaseBuffer(); PATH_TYPE Type = ParsePath(strLinkName); if(Type == PATH_DRIVELETTERUNC) { strLinkName.LShift(4); } } }
/* $ 02.02.2001 IS Заменяет пробелами непечатные символы в строке. В настоящий момент обрабатываются только cr и lf. */ string& WINAPI RemoveUnprintableCharacters(string &strStr) { wchar_t *p = strStr.GetBuffer(); while (*p) { if (IsEol(*p)) *p=L' '; p++; } strStr.ReleaseBuffer(strStr.GetLength()); return RemoveExternalSpaces(strStr); }
void WINAPI Unquote(string &strStr) { wchar_t *Dst = strStr.GetBuffer(); const wchar_t *Str = Dst; const wchar_t *StartPtr = Dst; while (*Str) { if (*Str!=L'\"') *Dst++=*Str; Str++; } strStr.ReleaseBuffer(Dst-StartPtr); }
void NormalizeSymlinkName(string &strLinkName) { if (!StrCmpN(strLinkName,L"\\??\\",4)) { if (IsNetworkPath(strLinkName) || IsLocalVolumePath(strLinkName)) { LPWSTR LinkName=strLinkName.GetBuffer(); LinkName[1]=L'\\'; strLinkName.ReleaseBuffer(); } else { strLinkName.LShift(4); } } }
DWORD farGetFullPathName(const TCHAR* lpFileName, string& strResult) { string strFileName = lpFileName; #ifdef UNICODE DWORD dwSize = FSF.ConvertPath(CPM_FULL, strFileName, NULL, 0); TCHAR* pBuffer = strResult.GetBuffer(dwSize+1); FSF.ConvertPath(CPM_FULL, strFileName, pBuffer, dwSize); strResult.ReleaseBuffer(); return dwSize; #else return apiGetFullPathName(strFileName, strResult); #endif }
int GetRegKey(const wchar_t *Key,const wchar_t *ValueName,string &strValueData,const wchar_t *Default,DWORD *pType) { int ExitCode=!ERROR_SUCCESS; HKEY hKey=OpenRegKey(Key); if (hKey) // надобно проверить! { DWORD Type,QueryDataSize=0; if ((ExitCode = RegQueryValueEx( hKey, ValueName, 0, &Type, nullptr, &QueryDataSize )) == ERROR_SUCCESS) { wchar_t *TempBuffer = strValueData.GetBuffer(QueryDataSize/sizeof(wchar_t)+1); // ...то выделим сколько надо ExitCode = RegQueryValueEx(hKey,ValueName,0,&Type,(unsigned char *)TempBuffer,&QueryDataSize); strValueData.ReleaseBuffer(QueryDataSize/sizeof(wchar_t)); if (strValueData.GetLength() > 0 && !strValueData.At(strValueData.GetLength()-1)) strValueData.SetLength(strValueData.GetLength()-1); } if (pType) *pType=Type; CloseRegKey(hKey); } if (ExitCode!=ERROR_SUCCESS) { strValueData = Default; return FALSE; } return TRUE; }
BOOL DeleteEndSlash(string &strPath, bool AllEndSlash) { BOOL Ret=FALSE; if (!strPath.IsEmpty()) { size_t len=strPath.GetLength(); wchar_t *lpwszPath = strPath.GetBuffer(); while (len && IsSlash(lpwszPath[--len])) { Ret=TRUE; lpwszPath[len] = L'\0'; if (!AllEndSlash) break; } strPath.ReleaseBuffer(); } return Ret; }
// На основе имени файла (Src) и маски (Dest) генерируем новое имя // SelectedFolderNameLength - длина каталога. Например, есть // каталог dir1, а в нем файл file1. Нужно сгенерировать имя по маске для dir1. // Параметры могут быть следующими: Src="dir1", SelectedFolderNameLength=0 // или Src="dir1\\file1", а SelectedFolderNameLength=4 (длина "dir1") int ConvertWildcards(const wchar_t *SrcName, string &strDest, int SelectedFolderNameLength) { string strPartAfterFolderName; string strSrc = SrcName; wchar_t *DestName = strDest.GetBuffer(strDest.GetLength()+strSrc.GetLength()+1); //??? wchar_t *DestNamePtr = (wchar_t*)PointToName(DestName); string strWildName = DestNamePtr; if (!wcschr(strWildName, L'*') && !wcschr(strWildName, L'?')) { //strDest.ReleaseBuffer (); не надо так как строка не поменялась return FALSE; } if (SelectedFolderNameLength) { strPartAfterFolderName = ((const wchar_t *)strSrc+SelectedFolderNameLength); strSrc.SetLength(SelectedFolderNameLength); } const wchar_t *Src = strSrc; const wchar_t *SrcNamePtr = PointToName(Src); int BeforeNameLength = DestNamePtr==DestName ? (int)(SrcNamePtr-Src) : 0; wchar_t *PartBeforeName = (wchar_t*)xf_malloc((BeforeNameLength+1)*sizeof(wchar_t)); xwcsncpy(PartBeforeName, Src, BeforeNameLength+1); const wchar_t *SrcNameDot = wcsrchr(SrcNamePtr, L'.'); const wchar_t *CurWildPtr = strWildName; while (*CurWildPtr) { switch (*CurWildPtr) { case L'?': CurWildPtr++; if (*SrcNamePtr) *(DestNamePtr++)=*(SrcNamePtr++); break; case L'*': CurWildPtr++; while (*SrcNamePtr) { if (*CurWildPtr==L'.' && SrcNameDot && !wcschr(CurWildPtr+1,L'.')) { if (SrcNamePtr==SrcNameDot) break; } else if (*SrcNamePtr==*CurWildPtr) { break; } *(DestNamePtr++)=*(SrcNamePtr++); } break; case L'.': CurWildPtr++; *(DestNamePtr++)=L'.'; if (wcspbrk(CurWildPtr,L"*?")) while (*SrcNamePtr) if (*(SrcNamePtr++)==L'.') break; break; default: *(DestNamePtr++)=*(CurWildPtr++); if (*SrcNamePtr && *SrcNamePtr!=L'.') SrcNamePtr++; break; } } *DestNamePtr=0; if (DestNamePtr!=DestName && *(DestNamePtr-1)==L'.') *(DestNamePtr-1)=0; strDest.ReleaseBuffer(); if (*PartBeforeName) strDest = PartBeforeName+strDest; if (SelectedFolderNameLength) strDest += strPartAfterFolderName; //BUGBUG???, was src in 1.7x xf_free(PartBeforeName); return TRUE; }