const CFileName CFileName::NoSpaceName() const// sans spaces { CStringArray ar1,ar2; const CString str2(ShortName()); LPCTSTR pc,pcStart; pcStart=*this; for(pc=*this;*pc;pc++){ if(_TCHAR('\\')==*pc){ ar1.Add(CString(pcStart,pc-pcStart)); pcStart=pc; } } ar1.Add(CString(pcStart,pc-pcStart)); pcStart=str2; for(pc=str2;*pc;pc++){ if(_TCHAR('\\')==*pc){ ar2.Add(CString(pcStart,pc-pcStart)); pcStart=pc; } } ar2.Add(CString(pcStart,pc-pcStart)); ASSERT(ar1.GetSize()==ar2.GetSize()); CString rc; for(int i=0;i<ar1.GetSize();i++){ rc+=(-1==ar1[i].Find(_TCHAR(' ')))?ar1[i]:ar2[i]; } return rc; }
void CDiskObject::QualifyPath( CString& str ) /* ============================================================ Function : CDiskObject::QualifyPath Description : Creates a fully qualified path from "str". Access : Private Return : void Parameters : CString& str - the path to qualify Usage : Call to create a fully qualified path. ============================================================*/ { str.Replace( _TCHAR( '/' ), _TCHAR( '\\' ) ); // Append a trailing backslash to directory name if( str.GetLength( ) ) if( str[ str.GetLength( ) - 1 ] != _TCHAR( '\\' ) ) str += _TCHAR( '\\' ); if( str.GetLength( ) < 2 || str.Left( 2) != "\\\\" ) QualifyFile( str ); }
// Create all keys down to the one specified bool CProperties::CreateKey(LPCTSTR pszKey,HKEY hKey/*=HKEY_CURRENT_USER*/) { bool rc=true; LPCTSTR pcStart=pszKey; LPCTSTR pcEnd; do { HKEY hKey2; pcEnd=_tcschr(pcStart,_TCHAR('\\')); if(NULL==pcEnd){ pcEnd=pcStart+_tcslen(pcStart); } String strKey(pcStart,pcEnd-pcStart); if(ERROR_SUCCESS!=RegCreateKeyEx(hKey, // handle to an open key strKey, // address of subkey name 0, // reserved 0, // address of class string REG_OPTION_NON_VOLATILE, // special options flag KEY_ALL_ACCESS, // desired security access NULL, // address of key security structure &hKey2, // address of buffer for opened handle NULL// address of disposition value buffer); )){ rc=false; break; } RegCloseKey(hKey); hKey=hKey2; pcStart=pcEnd+1; } while (_TCHAR('\0')!=*pcEnd); RegCloseKey(hKey); return rc; }
bool CProperties::SaveToFile(LPCTSTR pszFileName) const { CreatePathToFile(pszFileName); FILE *f=_tfopen(pszFileName,_T("w") MODE_TEXT); if(f){ for(int i=ar.size()-1;i>=0;--i){ const CProperty &p=ar[i]; String str(p.strName); str+=_TCHAR('='); switch(p.Type){ case CProperties::CProperty::Integer: case CProperties::CProperty::Bool: case CProperties::CProperty::Char: case CProperties::CProperty::Short: str+=String::SFormat(_T("%u"),p.GetValue()); break; case CProperties::CProperty::Float: case CProperties::CProperty::Double: case CProperties::CProperty::szString: case CProperties::CProperty::Void: str+=p.GetStringValue(); break; } str+=_TCHAR('\n'); _fputts(str,f); } fclose(f); } return (0!=f); }
void CSummaryPage::AddResult(CeCosTest *pTest) { const CString strResult((LPCTSTR)pTest->ResultString(false)); int nLength=strResult.GetLength(); CString arstr[8]; CString strTime,strDate; TRACE(_T("%s\n"),strResult); // 1999-05-28 10:29:28 nan:0 TX39-jmr3904-sim tx39-jmr3904sim-libc10-signal2.exe Fail 0k/1108k D=0.0/0.0 Total=9.3 E=0.6/300.0 _stscanf(strResult,_T("%s %s %s %s %s %s %s %s %s %s"),strDate.GetBuffer(1+nLength),strTime.GetBuffer(1+nLength),arstr[0].GetBuffer(1+nLength),arstr[1].GetBuffer(1+nLength),arstr[2].GetBuffer(1+nLength),arstr[3].GetBuffer(1+nLength),arstr[4].GetBuffer(1+nLength),arstr[5].GetBuffer(1+nLength),arstr[6].GetBuffer(1+nLength),arstr[7].GetBuffer(1+nLength)); // Remove before '=' in time fields for(int i=5;i<8;i++){ TCHAR *pch=_tcschr(arstr[i],_TCHAR('=')); if(pch){ arstr[i]=pch+1; } } strDate.ReleaseBuffer(); strTime.ReleaseBuffer(); strDate+=_TCHAR(' '); strDate+=strTime; int nItem=m_List.GetItemCount(); m_List.InsertItem(nItem,strDate); m_List.SetItemData(nItem,nItem);// to support sorting for(i=0;i<8;i++){ m_List.SetItemText(nItem,1+i,arstr[i]); arstr[i].ReleaseBuffer(); } }
ecFileName ecUtils::WPath(const std::string &str) { // Convert a path as read from cdl into host format // Change / to \ throughout ecFileName strPath(str.c_str()); strPath.Replace (_TCHAR('/'), _TCHAR('\\')); return strPath; }
int CUtils::Chop(LPCTSTR psz,CStringArray &ar,TCHAR cSep,bool bObserveStrings/*=false*/,bool bBackslashQuotes/*=false*/) { if(_TCHAR(' ')==cSep){ return Chop(psz,ar,_T("\t\n\v\f\r "),bObserveStrings,bBackslashQuotes); } else { ASSERT(_TCHAR('\0')!=cSep); TCHAR c[2]={cSep,_TCHAR('\0')}; return Chop(psz,ar,c,bObserveStrings,bBackslashQuotes); } }
BOOL CUtils::StrToItemIntegerType(const CString & str,__int64 &d) { extern int errno; PTCHAR pEnd; BOOL rc; errno=0; BOOL bHex=(str.GetLength()>2 && str[0]==_TCHAR('0') && (str[1]==_TCHAR('x')||str[1]==_TCHAR('X'))); d=_tcstol(str,&pEnd,bHex?16:10); rc=(0==errno && (*pEnd==_TCHAR('\0'))); return rc; }
//------------------------------------------------------------------------- bool ResetPermissionDialog::GetFolderText( stringT &Folder, bool bWarnRoot, bool bAddWildCard, bool bQuoteIfNeeded) { TCHAR Path[MAX_PATH * 4]; UINT len = GetDlgItemText( hDlg, IDTXT_FOLDER, Path, _countof(Path)); if (len == 0) return false; if (bWarnRoot) { // Warn if resetting root permissions if (_tcslen(Path) == 3 && Path[1] == _TCHAR(':') && Path[2] == _TCHAR('\\')) { if (MessageBox(hDlg, STR_ROOT_WARNING, STR_WARNING, MB_YESNO | MB_ICONWARNING) == IDNO) return false; } // Warn if tool is used on unsupported file system if (!IsSupportedFileSystem(Path)) { if (MessageBox(hDlg, STR_FS_NOT_SUPPORTED_WARNING, STR_WARNING, MB_YESNO | MB_ICONWARNING) == IDNO) return false; } } Folder = Path; // Add the wildcard mask if (bAddWildCard) { if (*Folder.rbegin() != TCHAR('\\')) Folder += _TEXT("\\"); Folder += _TEXT("*"); } // Quote the folder if needed if (bQuoteIfNeeded) QuotePath(Folder); return true; }
void CSummaryPage::OnEditSave() { CFileDialog dlg( FALSE, _T("log"), _T("Output"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Log Files (*.log)|*.log|All Files (*.*)|*.*||")); if(IDOK==dlg.DoModal()){ TRY { CStdioFile f( dlg.GetPathName(), CFile::modeCreate | CFile::modeWrite ); CString str; int arColWidth[nCols]; for(int nCol=0;nCol<nCols;nCol++){ int &w=arColWidth[nCol]; w=_tcslen(arpszCols[nCol]); for(int nItem=0;nItem<m_List.GetItemCount();nItem++){ w=max(w,m_List.GetItemText(nItem,nCol).GetLength()); } TRACE(_T("max[%d]=%d\n"),nCol,w); } for(nCol=0;nCol<nCols;nCol++){ const CString &strItem=arpszCols[nCol]; str+=strItem; if(nCol<nCols-1){ CString strTab(_TCHAR(' '),1+arColWidth[nCol]-strItem.GetLength()); str+=strTab; } } str+=_TCHAR('\n'); f.WriteString(str); for(int nItem=0;nItem<m_List.GetItemCount();nItem++){ CString str; for(int nCol=0;nCol<nCols;nCol++){ const CString strItem=m_List.GetItemText(nItem,nCol); str+=strItem; if(nCol<nCols-1){ CString strTab(_TCHAR(' '),1+arColWidth[nCol]-strItem.GetLength()); str+=strTab; } } str+=_TCHAR('\n'); f.WriteString(str); } f.Close(); } CATCH( CFileException, e ) { MessageBox(_T("Failed to write file")); }
BOOL CFindDialog::Create(LPCTSTR lpszFindWhat, DWORD dwFlags, WhereType where, CWnd* pParentWnd) { m_nFindPos=where; m_nIDHelp = AFX_IDD_FIND; m_fr.Flags |= dwFlags; ASSERT_VALID(pParentWnd); m_fr.hwndOwner = pParentWnd->m_hWnd; ASSERT(m_fr.hwndOwner != NULL); // must have a parent for modeless dialog m_fr.wFindWhatLen = sizeof(m_szFindWhat); int n=min(sizeof(m_szFindWhat)-1,_tcslen(lpszFindWhat)); _tcsncpy(m_szFindWhat, lpszFindWhat, n); m_szFindWhat[n]=_TCHAR('\0'); AfxHookWindowCreate(this); HWND hWnd = ::FindText(&m_fr); if (!AfxUnhookWindowCreate()){ PostNcDestroy(); } ASSERT(hWnd == NULL || hWnd == m_hWnd); return hWnd != NULL; }
const wxString wxProcessKiller::Name(int pid) { wxString str; str.Printf(_T("id=%d"),pid); #ifdef _DEBUG #ifdef _WIN32 if(VER_PLATFORM_WIN32_NT==GetPlatform() && hInstLib1){ static BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE *, DWORD, LPDWORD ) = (BOOL(WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD)) GetProcAddress( (HINSTANCE) hInstLib1,"EnumProcessModules" ) ; static DWORD (WINAPI *lpfGetModuleFileNameEx)( HANDLE, HMODULE, LPTSTR, DWORD )= (DWORD (WINAPI *)(HANDLE, HMODULE,LPTSTR, DWORD )) GetProcAddress( (HINSTANCE) hInstLib1,"GetModuleFileNameExA" ) ; if( lpfEnumProcessModules && lpfGetModuleFileNameEx ) { HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,false,pid); if(hProcess) { HMODULE hMod; DWORD dwSize; if(lpfEnumProcessModules( hProcess, &hMod, sizeof(HMODULE), &dwSize ) ){ // Get Full pathname: TCHAR buf[1+MAX_PATH]; lpfGetModuleFileNameEx( hProcess, hMod, buf, MAX_PATH); str+=_TCHAR(' '); str+=buf; } CloseHandle(hProcess); } } } #endif #endif return str; }
bool CProperties::CreatePathToFile(LPCTSTR pszDir) { // Create intermediate directories #ifdef _WIN32 const TCHAR cSep='\\'; #else // UNIX const TCHAR cSep='/'; #endif for(LPCTSTR c=_tcschr(pszDir,cSep);c;c=_tcschr(c+1,cSep)){ #ifdef _WIN32 if(c==pszDir+2 && _istalpha(pszDir[0]) && _TCHAR(':')==pszDir[1]){ continue; // don't attempt to create "C:" } #endif String strDir(pszDir,c-pszDir); struct _stat buf; if(!(0==_tstat(strDir,&buf) && (S_IFDIR&buf.st_mode))){ // Need to create directory bool b=(0==_tmkdir(strDir)); TRACE(_T("Create directory %s rc=%d\n"),(LPCTSTR)strDir,b); if(!b){ return false; } } } return true; }
LPVOID* Environment::CreateEnvironmentFromMap() { size_t size = 0; for (auto varsIterator = _vars.begin(); varsIterator != _vars.end(); ++varsIterator) { size += varsIterator->first.size() + varsIterator->second.size() + 2; } size++; auto environment = new _TCHAR[size]; memset(environment, 0, sizeof(_TCHAR) * size); size_t pointer = 0; for (auto varsIterator = _vars.begin(); varsIterator != _vars.end(); ++varsIterator) { auto curSize = varsIterator->first.size(); memcpy(environment + pointer, varsIterator->first.c_str(), curSize * sizeof(_TCHAR)); pointer += curSize; environment[pointer] = _TCHAR('='); pointer ++; curSize = varsIterator->second.size(); memcpy(environment + pointer, varsIterator->second.c_str(), curSize * sizeof(_TCHAR)); pointer += curSize; pointer ++; } return reinterpret_cast<LPVOID*>(environment); }
void COutputPage::AddText(LPCTSTR psz) { const CString str(psz); CString strText; // Change \n into \r\n int nStart=0; for(int nIndex=0;nIndex<str.GetLength();nIndex++){ if(str[nIndex]==_TCHAR('\n')){ if(nIndex==0||str[nIndex-1]!=_TCHAR('\r')){ strText+=str.Mid(nStart,nIndex-nStart); strText+=_TCHAR('\r'); nStart=nIndex; } } } strText+=str.Mid(nStart,nIndex-nStart); /* CString strWText; m_Edit.GetWindowText(strWText); strWText+=strText; m_Edit.SetWindowText(strWText); */ { int nStart,nEnd; int nLength=m_Edit.GetWindowTextLength(); m_Edit.GetSel(nStart,nEnd); // Replace selection m_Edit.SetSel(nLength,nLength,TRUE); m_Edit.ReplaceSel(strText); if(m_Edit.GetWindowTextLength()!=nLength+strText.GetLength()){ // Try again by removing equivalent length from start of buffer. // For neatness, remove whole lines int nLine=m_Edit.LineFromChar(strText.GetLength()-1); int nIndex=m_Edit.LineIndex(nLine+1); m_Edit.SetSel(0,nIndex-1,TRUE); m_Edit.ReplaceSel(_T("")); nLength=m_Edit.GetWindowTextLength(); m_Edit.SetSel(nLength,nLength,TRUE); m_Edit.ReplaceSel(strText); } else if(nStart!=nEnd) { m_Edit.SetSel(nStart,nEnd,TRUE); } } }
BOOL CUtils::StrToDouble (const CString & strValue, double &dValue) { extern int errno; PTCHAR pEnd; errno = 0; dValue = _tcstod (strValue, &pEnd); return (0 == errno) && (*pEnd == _TCHAR('\0')); }
bool CFileName::CreateDirectory(bool bParentsToo,bool bFailIfAlreadyExists) const { LPCTSTR pszDir=m_pchData; if(bParentsToo){ // Create intermediate directories for(LPCTSTR c=_tcschr(pszDir,_TCHAR('\\'));c;c=_tcschr(c+1,_TCHAR('\\'))){ if(c==pszDir+2 && _istalpha(pszDir[0]) && _TCHAR(':')==pszDir[1]){ continue; // don't attempt to create "C:" } const CFileName strDir(pszDir,c-pszDir); if(!(strDir.IsDir()? (!bFailIfAlreadyExists) : ::CreateDirectory(strDir,NULL))){ return false; } } } return IsDir()? (!bFailIfAlreadyExists) : (TRUE==::CreateDirectory(pszDir,NULL)); }
void CFileName::ReplaceExtension(LPCTSTR pszNewExt) { ASSERT(pszNewExt); if(_TCHAR('.')==*pszNewExt){ // Be tolerant of whether '.' is included in what we are passed: pszNewExt++; } LPTSTR pch=GetBuffer(2+GetLength()+_tcslen(pszNewExt)); LPTSTR pcExt=_tcsrchr(pch,_TCHAR('.')); if(NULL==pcExt || _tcschr(pcExt,cSep)){ // No existing extension pcExt=pch+GetLength(); *pcExt++=_TCHAR('.'); } _tcscpy(pcExt+1,pszNewExt); ReleaseBuffer(); }
void String::ReleaseBuffer() { assert(m_pszBuf); m_pszBuf[m_nBufferLength]=_TCHAR('\0'); // just in case the terminating null has been forgotten string::operator=(m_pszBuf); delete [] m_pszBuf; m_pszBuf=0; }
const CString CFileName::Root() const { LPCTSTR ch=_tcsrchr(m_pchData,_TCHAR('.')); if(ch && !_tcschr(ch,cSep)){ return CString(m_pchData,ch-m_pchData); } else { return m_pchData; } }
const CString CFileName::Extension() const { LPCTSTR ch=_tcsrchr(m_pchData,_TCHAR('.')); if(ch && !_tcschr(ch,cSep)){ return CString(ch+1); } else { return _T(""); } }
void CFileName::Normalize() { // Remove any trailing slash int &n=GetData()->nDataLength; if(n>1 && (cSep==m_pchData[n-1])){ n--; m_pchData[n] = _TCHAR('\0'); } }
int InitHeader(CListCtrl& list, const CString& header, int first) { int beg, end, nbCol, fmt, field, len; HDITEM hi; if (first == 0) { // Delete the old columns int nbCol = list.GetHeaderCtrl()->GetItemCount(); while (--nbCol >= 0) list.DeleteColumn(0); } len = header.GetLength(); hi.mask = HDI_LPARAM|HDI_IMAGE; hi.iImage = 0; // Loop for all columns (a field in the string for each) for (beg = nbCol = 0; beg < len; nbCol++, beg = end + 1) { // It's not '\n' at the last field if ( (end = header.Find(_TCHAR('\n'), beg)) < 0 ) end = len; if (end > beg) { // Read the data type switch ( header.GetAt(beg) ) { case _TCHAR('T'): hi.lParam = STI_TEXT, beg++; break; case _TCHAR('N'): hi.lParam = STI_REVERSE|STI_NUMBER, beg++; break; case _TCHAR('H'): hi.lParam = STI_REVERSE|STI_HEXADEC,beg++; break; case _TCHAR('A'): hi.lParam = STI_REVERSE|STI_ABSOLU ,beg++; break; default : hi.lParam = 0; // sort disable } } else hi.lParam = 0; // sort disable if (end > beg) { // Read the alignment of the column and skip this char switch ( header.GetAt(beg) ) { case _TCHAR('L'): fmt = LVCFMT_LEFT, beg++; break; case _TCHAR('C'): fmt = LVCFMT_CENTER, beg++; break; case _TCHAR('R'): fmt = LVCFMT_RIGHT, beg++; break; default : fmt = LVCFMT_LEFT; } } else fmt = LVCFMT_LEFT; if ( (field = end - beg) >= 0 ) { // Inserts a new column in the list view list.InsertColumn(first + nbCol, header.Mid(beg, field), fmt); list.GetHeaderCtrl()->SetItem(first + nbCol, &hi); } } // Set reasonable widths for our columns for (int i = 0; i < nbCol; i++) list.SetColumnWidth(first + i, LVSCW_AUTOSIZE_USEHEADER); return first + nbCol; }
int String::Chop(StringArray &ar,TCHAR cSep,bool bObserveStrings/*=TRUE*/) const { assert('\0'!=cSep); #define IsSep(c) (cSep==_TCHAR(' ')?_istspace(c):c==cSep) LPCTSTR c=c_str(); ar.clear(); while(*c){ // Spaces are slightly different from other separators - we treat multiple instances as // just one (a la sscanf) if(_istspace(cSep)){ while(IsSep(*c))c++; } else if (ar.size()>0) { c++; } if(*c){ String strTok; if(bObserveStrings){ bool bInString=false; do{ if(*c==_TCHAR('\\') && c[1]){ strTok+=c[1]; c++; } else if(*c==_TCHAR('"')){ bInString ^= 1; } else if (!bInString && IsSep(*c)) { break; } else { strTok+=*c; } } while (*++c); } else { do { if(IsSep(*c)) { break; } else { strTok+=*c; } } while (*++c); } ar.push_back(strTok); } } return ar.size(); }
bool CFileName::IsAbsolute() const { int nLength=GetLength(); LPCTSTR psz=*this; return (nLength>0 && (cSep==psz[0]))|| // starts with '\' (nLength>1 && ( (_istalpha(psz[0]) && _TCHAR(':')==psz[1]) || // starts with [e.g.] "c:\" (cSep==psz[0] && cSep==psz[1]))); // UNC }
//------------------------------------------------------------------------- LPCTSTR ResetPermissionDialog::GenerateWorkBatchFileName() { // Make temp file name static TCHAR CmdFileName[MAX_PATH2] = { 0 }; // Compute if it was not already computed if (CmdFileName[0] == _TCHAR('\0')) { // Attempt to use local user AppData folder if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, CmdFileName))) { _tcsncat_s(CmdFileName, STR_FOLDER_LALLOUSLAB, _countof(CmdFileName)); // Work directory note found? Create it! if ((GetFileAttributes(CmdFileName) == INVALID_FILE_ATTRIBUTES) && !CreateDirectory(CmdFileName, nullptr)) { // Failed to create the folder. Discard the local app folder and use temp folder CmdFileName[0] = _T('\0'); } } // Revert to temp folder if this fails if (CmdFileName[0] == _TCHAR('\0')) { // Get temp path via the API if (GetTempPath(_countof(CmdFileName), CmdFileName) == 0) { // Attempt to get it again via the environment variable if (GetEnvironmentVariable(_TEXT("TEMP"), CmdFileName, _countof(CmdFileName)) == 0) return nullptr; } } if (CmdFileName[_tcslen(CmdFileName) - 1] != TCHAR('\\')) _tcsncat_s(CmdFileName, _TEXT("\\"), _countof(CmdFileName)); _tcsncat_s(CmdFileName, STR_RESET_FN, _countof(CmdFileName)); } return CmdFileName; }
bool CProperties::CProperty::SetValue(LPCTSTR psz) { bool rc=false; TCHAR *pEnd; double d=0.0; long l=0; switch(Type){ case szString: *(String *)pData=psz; rc=true; break; case Float: d=_tcstod(psz,&pEnd); rc=(_TCHAR('\0')==*pEnd); if(rc){ SetValue((float)d); } break; case Double: d=_tcstod(psz,&pEnd); rc=(_TCHAR('\0')==*pEnd); if(rc){ SetValue(d); } break; case Integer: case Bool: case Char: case Short: l=_tcstol(psz,&pEnd,10); rc=(_TCHAR('\0')==*pEnd); if(rc){ SetValue((int)l); } break; default: TRACE(_T("Failed to set '%s' to string value '%s'\n"),(LPCTSTR)strName,psz); break; } return rc; }
String CProperties::MakeCommandString() const { String strResult; bool bFirst=true; for(int i=ar.size()-1;i>=0;--i){ String str; const CProperty &p=ar[i]; switch(p.Type){ case CProperties::CProperty::Integer: case CProperties::CProperty::Bool: case CProperties::CProperty::Char: case CProperties::CProperty::Short: str.Format(_T("-%s=%u"),(LPCTSTR)p.strName,p.GetValue()); break; case CProperties::CProperty::szString: { // Quote the string, escaping existing quotes as necessary str.Format(_T("-%s=\""),(LPCTSTR)p.strName); for(LPCTSTR c=p.GetStringValue();*c;c++){ if(_TCHAR('"')==*c){ str+=_TCHAR('\\'); } str+=*c; } str+=_TCHAR('"'); } break; case CProperties::CProperty::Float: case CProperties::CProperty::Double: case CProperties::CProperty::Void: str.Format(_T("-%s=%s"),(LPCTSTR)p.GetStringValue()); break; } if(!bFirst){ strResult+=_TCHAR(' '); } bFirst=false; strResult+=str; } return strResult; }
const CFileName CFileName::CygPath () const { TCHAR buf[2+MAX_PATH]; LPCTSTR rc=buf+1; if(!GetShortPathName(m_pchData,1+buf,MAX_PATH)){ _tcscpy(1+buf,m_pchData); } if(_istalpha(*rc)&&_TCHAR(':')==rc[1]){ // Convert c:\ to //c/ [this is the bit that requires the first char of buf] buf[0]=_TCHAR('/'); buf[2]=buf[1]; buf[1]=_TCHAR('/'); rc=buf; } for(TCHAR *c=buf+1;*c;c++){ if(_TCHAR('\\')==*c){ *c=_TCHAR('/'); } } return rc; }
int CUtils::Chop(LPCTSTR psz,CStringArray &ar,LPCTSTR pszSep,bool bObserveStrings/*=false*/,bool bBackslashQuotes/*=false*/) { ar.RemoveAll(); int i=0; for(;;){ // Skip multiple separators while(*psz&&_tcschr(pszSep,*psz)){ psz++; } if(!*psz){ return i; } CString strTok; if(bObserveStrings){ BOOL bInString=FALSE; do{ if(*psz==_TCHAR('\\') && bBackslashQuotes && psz[1]){ strTok+=psz[1]; psz++; } else if(*psz==_TCHAR('"')){ bInString ^= 1; } else if (!bInString && *psz && NULL!=_tcschr(pszSep,*psz)) { break; } else { strTok+=*psz; } } while (*++psz); } else { LPCTSTR pszStart=psz; do { psz++; } while (*psz && !_tcschr(pszSep,*psz)); strTok=CString(pszStart,psz-pszStart); } ar.SetAtGrow(i++,strTok); } return ar.GetSize(); }