Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: pathcomp.hxx
//
// Contents: Class definitions for doing "smart" path comparison in
// bigtable.
//
// Classes: CSplitPath, CSplitPathCompare
//
// History: 5-09-95 srikants Created
//
//----------------------------------------------------------------------------
#pragma once
#include "pathstor.hxx"
//+---------------------------------------------------------------------------
//
// Class: CSplitPath
//
// Purpose: To hold a path as consisting of two components - a parent
// component and a file component. This will be used
// for doing path comparisons without having to construct a
// full path but instead using the two components.
//
// History: 5-09-95 srikants Created
//
// Notes: It is possible to simplify the logic of comparison if we
// were to construct a full path by concatening the parent
// and file but that would require a big buffer. Allocating
// from heap for each comparison is expensive and the buffer is
// too big (MAX_PATH * sizeof(WCHAR)) to be allocated on stack.
// If stack can be used, the logic can be simplified
// significantly.
//
//----------------------------------------------------------------------------
class CSplitPath { enum ECompareStep { eUseParent, eUsePathSep, eUseFile, eDone }; friend class CPathStore;
public:
CSplitPath( CPathStore & pathStore, PATHID pathid );
CSplitPath( const WCHAR * path );
void Advance( ULONG cwc );
BOOL IsDone() const { return eDone == _step; }
int CompareCurr( CSplitPath & rhs ) { ULONG cwcMin = min( _cwcCurr, rhs._cwcCurr ); if ( 0 == cwcMin ) return 0;
return _wcsnicmp( _pCurr, rhs._pCurr, cwcMin ); }
ULONG GetCurrLen() const { return _cwcCurr; }
unsigned GetStep() const { return _step; }
void FormFullPath( WCHAR * pwszPath, ULONG cwcPath ) const ; void FormFileName( WCHAR * pwszFile, ULONG cwcFile ) const ;
ULONG GetFullPathLen() const; ULONG GetFileNameLen() const { return _cwcFile+1; }
void InitForPathCompare() { _pCurr = _pParent; _cwcCurr = _cwcParent; _step = eUseParent; }
void InitForNameCompare() { if ( 0 != _pFile ) _SetUseFile(); else _SetDone(); }
private:
//
// Parent part of the path.
//
const WCHAR * _pParent; ULONG _cwcParent;
//
// File part of the path.
//
const WCHAR * _pFile; ULONG _cwcFile;
//
// Used for comparing two split paths.
//
const WCHAR * _pCurr; ULONG _cwcCurr; ECompareStep _step;
static const WCHAR _awszPathSep[];
void _SetUsePathSep() { _pCurr = _awszPathSep; _cwcCurr = 1; _step = eUsePathSep; }
void _SetUseFile() { Win4Assert( 0 != _pFile ); _pCurr = _pFile; _cwcCurr = _cwcFile; _step = eUseFile; }
void _SetDone() { _pCurr = 0; _cwcCurr = 0; _step = eDone; } };
//+---------------------------------------------------------------------------
//
// Class: CSplitPathCompare
//
// Purpose: To compare two paths which are "Split".
//
// History: 5-09-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
class CSplitPathCompare {
public:
CSplitPathCompare( CSplitPath & lhs, CSplitPath & rhs ) : _lhs(lhs), _rhs(rhs) { }
int ComparePaths(); int CompareNames();
private:
CSplitPath & _lhs; CSplitPath & _rhs;
BOOL _IsDone() const { return _lhs.IsDone() || _rhs.IsDone(); } int _Compare();
};
|