windows-nt/Source/XPSP1/NT/inetsrv/query/h/smatch.hxx
2020-09-26 16:20:57 +08:00

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) );
}