int CLiveList::SortProc(LPCTSTR sB, LPCTSTR sA, BOOL bNumeric) { // ToDo: Fix Click-order properly (Revert above sB-sA workaround!) DWORD ipA, ipB; if ( atoip( sA, ipA ) && atoip( sB, ipB ) ) { TCHAR* pA = (TCHAR*)_tcschr( sA, '/' ); TCHAR* pB = (TCHAR*)_tcschr( sB, '/' ); DWORD maskA = 0xffffffff, maskB = 0xffffffff; if ( ( ! pA || atoip( pA + 1, maskA ) ) && ( ! pB || atoip( pB + 1, maskB ) ) ) { QWORD nA = ( ( (QWORD) ipA ) << 32 ) | maskA; QWORD nB = ( ( (QWORD) ipB ) << 32 ) | maskB; if ( nA < nB ) return -1; if ( nA > nB ) return 1; return 0; } } if ( bNumeric || ( IsNumber( sA ) && IsNumber( sB ) ) ) { double nA = 0, nB = 0; if ( *sA == '(' || *sA == 'Q' ) _stscanf( sA+1, _T("%lf"), &nA ); else _stscanf( sA, _T("%lf (%lf)"), &nA, &nA ); if ( *sB == '(' || *sB == 'Q' ) _stscanf( sB+1, _T("%lf"), &nB ); else _stscanf( sB, _T("%lf (%lf)"), &nB, &nB ); if ( _tcsstr( sA, _T(" K") ) ) nA *= 1024; if ( _tcsstr( sA, _T(" M") ) ) nA *= 1024*1024; if ( _tcsstr( sA, _T(" G") ) ) nA *= 1024*1024*1024; if ( _tcsstr( sA, _T(" T") ) ) nA *= 1099511627776.0f; if ( _tcsstr( sB, _T(" K") ) ) nB *= 1024; if ( _tcsstr( sB, _T(" M") ) ) nB *= 1024*1024; if ( _tcsstr( sB, _T(" G") ) ) nB *= 1024*1024*1024; if ( _tcsstr( sB, _T(" T") ) ) nB *= 1099511627776.0f; if ( nB < nA ) return -1; if ( nB > nA ) return 1; return 0; } return _tcsicoll( sA, sB ); }
CZIPFile::File* CZIPFile::GetFile(LPCTSTR pszFile, BOOL bPartial) const { File* pFile = m_pFile; for ( int nFile = m_nFile ; nFile ; nFile--, pFile++ ) { if ( bPartial ) { LPCTSTR pszName = _tcsrchr( pFile->m_sName, '/' ); pszName = pszName ? pszName + 1 : (LPCTSTR)pFile->m_sName; if ( _tcsicoll( pszName, pszFile ) == 0 ) return pFile; } else { if ( _tcsicoll( pFile->m_sName, pszFile ) == 0 ) return pFile; } } return NULL; }
int CLibraryAlbumView::SortList(LPCVOID pA, LPCVOID pB) { CLibraryAlbumTrack* ppA = *(CLibraryAlbumTrack**)pA; CLibraryAlbumTrack* ppB = *(CLibraryAlbumTrack**)pB; if ( m_pStaticStyle == CSchema::uriMusicAlbum ) { if ( ppA->m_nTrack != ppB->m_nTrack ) return ( ppA->m_nTrack < ppB->m_nTrack ) ? -1 : 1; return _tcsicoll( ppA->m_sTitle, ppB->m_sTitle ); } else if ( m_pStaticStyle == CSchema::uriMusicArtist ) { int nCompare = _tcsicoll( ppA->m_sAlbum, ppB->m_sAlbum ); if ( nCompare ) return nCompare; return _tcsicoll( ppA->m_sTitle, ppB->m_sTitle ); } else { int nCompare = _tcsicoll( ppA->m_sArtist, ppB->m_sArtist ); if ( nCompare ) return nCompare; if ( ( nCompare = _tcsicoll( ppA->m_sAlbum, ppB->m_sAlbum ) ) != 0 ) return nCompare; return _tcsicoll( ppA->m_sTitle, ppB->m_sTitle ); } }
CBrowseTreeItem* CBrowseTreeItem::Add(CBrowseTreeItem* pNewItem) { if ( m_nCount == m_nBuffer ) { if ( m_nBuffer ) m_nBuffer += min( m_nBuffer, 16 ); else m_nBuffer = 4; CBrowseTreeItem** pList = new CBrowseTreeItem*[ m_nBuffer ]; if ( m_nCount ) CopyMemory( pList, m_pList, m_nCount * 4 ); if ( m_pList ) delete [] m_pList; m_pList = pList; } if ( m_nCount == 0 ) return m_pList[ m_nCount++ ] = pNewItem; int nFirst = 0; for ( int nLast = m_nCount - 1 ; nLast >= nFirst ; ) { int nMiddle = ( nFirst + nLast ) >> 1; CBrowseTreeItem* pItem = m_pList[ nMiddle ]; if ( _tcsicoll( pNewItem->m_sText, pItem->m_sText ) >= 0 ) { nFirst = nMiddle + 1; } else { nLast = nMiddle - 1; } } MoveMemory( m_pList + nFirst + 1, m_pList + nFirst, ( m_nCount - nFirst ) << 2 ); m_nCount++; return m_pList[ nFirst ] = pNewItem; }
int CLibraryDetailView::ListCompare(LPCVOID pA, LPCVOID pB) { LDVITEM* ppA = (LDVITEM*)pA; LDVITEM* ppB = (LDVITEM*)pB; int nTest = 0; CLibraryFile* pfA = Library.LookupFile( ppA->nIndex ); CLibraryFile* pfB = Library.LookupFile( ppB->nIndex ); if ( ! pfA || ! pfB ) return 0; switch ( m_pThis->m_nSortColumn ) { case 0: nTest = _tcsicoll( pfA->m_sName, pfB->m_sName ); break; case 1: { LPCTSTR pszA = _tcsrchr( pfA->m_sName, '.' ); LPCTSTR pszB = _tcsrchr( pfB->m_sName, '.' ); if ( ! pszA || ! pszB ) return 0; nTest = _tcsicoll( pszA, pszB ); break; } case 2: if ( pfA->GetSize() == pfB->GetSize() ) nTest = 0; else if ( pfA->GetSize() < pfB->GetSize() ) nTest = -1; else nTest = 1; break; case 3: if ( pfA->m_pFolder == NULL || pfB->m_pFolder == NULL ) return 0; nTest = _tcsicoll( pfA->m_pFolder->m_sPath, pfB->m_pFolder->m_sPath ); break; case 4: if ( pfA->m_nHitsTotal == pfB->m_nHitsTotal ) nTest = 0; else if ( pfA->m_nHitsTotal < pfB->m_nHitsTotal ) nTest = -1; else nTest = 1; break; case 5: if ( pfA->m_nUploadsTotal == pfB->m_nUploadsTotal ) nTest = 0; else if ( pfA->m_nUploadsTotal < pfB->m_nUploadsTotal ) nTest = -1; else nTest = 1; break; case 6: nTest = CompareFileTime( &pfA->m_pTime, &pfB->m_pTime ); break; default: { int nColumn = m_pThis->m_nSortColumn - DETAIL_COLUMNS; if ( nColumn >= m_pThis->m_pColumns.GetCount() ) return 0; POSITION pos = m_pThis->m_pColumns.FindIndex( nColumn ); if ( pos == NULL ) return 0; CSchemaMember* pMember = (CSchemaMember*)m_pThis->m_pColumns.GetAt( pos ); CString strA, strB; if ( pfA->m_pMetadata ) strA = pMember->GetValueFrom( pfA->m_pMetadata, NULL, TRUE ); if ( pfB->m_pMetadata ) strB = pMember->GetValueFrom( pfB->m_pMetadata, NULL, TRUE ); if ( *(LPCTSTR)strA && *(LPCTSTR)strB && ( ((LPCTSTR)strA)[ _tcslen( strA ) - 1 ] == 'k' || ((LPCTSTR)strA)[ _tcslen( strA ) - 1 ] == '~' ) && ( ((LPCTSTR)strB)[ _tcslen( strB ) - 1 ] == 'k' || ((LPCTSTR)strB)[ _tcslen( strB ) - 1 ] == '~' ) ) { nTest = CLiveList::SortProc( strA, strB, TRUE ); } else { nTest = _tcsicoll( strA, strB ); } } } if ( ! m_pThis->m_bSortFlip ) nTest = -nTest; return nTest; }
/** * @brief Compare two strings ignoring the character casing. * @param [in] str1 First string to compare. * @param [in] str2 Second string to compare. * @return As strcmp(), 0 if strings match. */ int compare_nocase(const String &str1, const String &str2) { return _tcsicoll(str1.c_str(), str2.c_str()); }