172 lines
4.3 KiB
C++
172 lines
4.3 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1991 - 1996.
|
|
//
|
|
// File: Smatch.hxx
|
|
//
|
|
// Classes: CScopeMatch
|
|
//
|
|
// History: 07 Feb 96 KyleP Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CScopeMatch
|
|
//
|
|
// Purpose: A small helper class to test if a given path matches a
|
|
// scope or not.
|
|
//
|
|
// History: 1-22-96 srikants Created
|
|
//
|
|
// Notes: This is useful for determining if a given path is in
|
|
// a scope or not.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CScopeMatch
|
|
{
|
|
public:
|
|
|
|
CScopeMatch( ) :
|
|
_pwcsRoot(0), _len(0)
|
|
{
|
|
}
|
|
|
|
CScopeMatch( WCHAR const * pwcsRoot, ULONG len ) :
|
|
_pwcsRoot(0), _len(0)
|
|
{
|
|
Init( pwcsRoot, len );
|
|
}
|
|
|
|
void Init( WCHAR const * pwcsRoot, ULONG len )
|
|
{
|
|
Win4Assert( 0 == _len || 0 != _pwcsRoot );
|
|
|
|
_pwcsRoot = pwcsRoot;
|
|
_len = len;
|
|
|
|
if ( _len > 0 && L'\\' == _pwcsRoot[_len-1] )
|
|
{
|
|
if( _len > 1 )
|
|
_len--;
|
|
else
|
|
{
|
|
_pwcsRoot = 0;
|
|
_len = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
inline BOOL IsInScope( WCHAR const * pwcsPath, ULONG len ) const;
|
|
|
|
inline BOOL IsPrefix( WCHAR const * pwcsPath, ULONG len ) const;
|
|
|
|
inline BOOL IsNullScope() const { return 0 == _pwcsRoot; }
|
|
|
|
private:
|
|
|
|
WCHAR const * _pwcsRoot;
|
|
ULONG _len;
|
|
};
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CScopeMatch::IsInScope
|
|
//
|
|
// Synopsis: Tests if a given path is in the scope of this object.
|
|
// I.e., is the path in the scope a prefix of the input
|
|
// path.
|
|
//
|
|
// Arguments: [wcsPath] - Path to be tested. Must NOT be NULL.
|
|
// [len] - Length of this path.
|
|
//
|
|
// Returns: TRUE if the given path is in the scope. FALSE o/w
|
|
//
|
|
// History: 1-22-96 srikants Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline BOOL CScopeMatch::IsInScope( WCHAR const * wcsPath, ULONG len ) const
|
|
{
|
|
|
|
//
|
|
// It is possible to have a NULL string ("") with length 0.
|
|
//
|
|
Win4Assert( 0 == len || 0 != wcsPath );
|
|
|
|
// if the scope root is NULL, match with everything
|
|
if ( 0 == _pwcsRoot || 0 == _len )
|
|
return TRUE;
|
|
|
|
//
|
|
// Test directory must be at least as long as scope
|
|
//
|
|
if ( _len > len )
|
|
return( FALSE );
|
|
else if ( _len < len )
|
|
{
|
|
//
|
|
// Make sure path has a path separator at the same place the
|
|
// scope directory name ends.
|
|
//
|
|
|
|
if ( wcsPath[_len] != L'\\' )
|
|
return( FALSE );
|
|
}
|
|
|
|
return RtlEqualMemory( wcsPath, _pwcsRoot, _len * sizeof(WCHAR) );
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CScopeMatch::IsPrefix
|
|
//
|
|
// Synopsis: Tests if a given path is a prefix of the scope.
|
|
//
|
|
// Arguments: [wcsPath] - Path to be tested. May be NULL. May
|
|
// optionally have a \ at the end.
|
|
// [len] - Length of this path.
|
|
//
|
|
// Returns: TRUE if the given path prefixes the scope. FALSE o/w
|
|
//
|
|
// History: 1-22-96 srikants Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline BOOL CScopeMatch::IsPrefix( WCHAR const * wcsPath, ULONG len ) const
|
|
{
|
|
// remove optional trailing '\' on input path
|
|
if ( len > 0 && wcsPath[len-1] == L'\\')
|
|
len --;
|
|
|
|
// Null paths prefix everything.
|
|
if ( 0 == len || 0 == wcsPath )
|
|
return TRUE;
|
|
|
|
//
|
|
// Test directory name must be up to as long as the scope
|
|
//
|
|
if ( len > _len )
|
|
return FALSE;
|
|
|
|
else if ( len < _len )
|
|
{
|
|
//
|
|
// Make sure the scope name has a path separator at the same place the
|
|
// input directory name ends
|
|
//
|
|
|
|
if ( _pwcsRoot[ len ] != L'\\' )
|
|
return FALSE;
|
|
}
|
|
|
|
return RtlEqualMemory( wcsPath, _pwcsRoot, len * sizeof(WCHAR) );
|
|
}
|
|
|