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