262 lines
6.4 KiB
C++
262 lines
6.4 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1996 - 2000.
|
|
//
|
|
// File: lcase.hxx
|
|
//
|
|
// Contents: Lowercases path
|
|
//
|
|
// History: 01-Jan-1996 KyleP Moved from cicat.cxx
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
|
|
inline void TerminateWithBackSlash( WCHAR * pwszStr, ULONG & cc )
|
|
{
|
|
if ( 0 != pwszStr && 0 != cc )
|
|
{
|
|
if ( L'\\' != pwszStr[cc-1] )
|
|
{
|
|
pwszStr[cc++] = L'\\';
|
|
pwszStr[cc] = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
#if CIDBG == 1
|
|
inline void _AssertLowerCase( const WCHAR * pwszStr, ULONG cchLen = 0 )
|
|
{
|
|
if ( 0 == cchLen )
|
|
{
|
|
cchLen = wcslen( pwszStr );
|
|
}
|
|
XGrowable<WCHAR> xTmp( cchLen + 1 );
|
|
|
|
ULONG cchLen2 = LCMapStringW ( LOCALE_NEUTRAL,
|
|
LCMAP_LOWERCASE,
|
|
pwszStr,
|
|
cchLen,
|
|
xTmp.Get(),
|
|
xTmp.Count() );
|
|
|
|
Win4Assert( cchLen == cchLen2 );
|
|
Win4Assert( RtlCompareMemory( xTmp.Get(), pwszStr, cchLen * sizeof WCHAR ) );
|
|
}
|
|
|
|
#define AssertLowerCase(pwszStr, cchLen) _AssertLowerCase(pwszStr, cchLen)
|
|
|
|
#else
|
|
|
|
#define AssertLowerCase(pwszStr, cchLen)
|
|
|
|
#endif
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CLowcaseBuf
|
|
//
|
|
// Purpose: Buffer to create lower case copy of string
|
|
//
|
|
// History: 10-Mar-92 BartoszM Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CLowcaseBuf
|
|
{
|
|
public:
|
|
|
|
inline CLowcaseBuf ( WCHAR const * str );
|
|
inline CLowcaseBuf ( WCHAR const * str, BOOL fIsLower );
|
|
|
|
inline ~CLowcaseBuf();
|
|
|
|
WCHAR const * Get() const { return _pBuf; }
|
|
|
|
WCHAR * GetWriteable() { return _pBuf; }
|
|
|
|
unsigned Length() const { return _cchLen; }
|
|
|
|
void AppendBackSlash()
|
|
{
|
|
if ( 0 == _pBuf || 0 == _cchLen || L'\\' == _pBuf[_cchLen-1] )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( _fOwned && _cchLen + 2 > _cchSize )
|
|
{
|
|
// Need more space
|
|
WCHAR* pTmp = new WCHAR[++_cchSize];
|
|
RtlCopyMemory( pTmp, _pBuf, _cchLen * sizeof( WCHAR ) );
|
|
|
|
if ( _pBuf != _buf )
|
|
delete [] _pBuf;
|
|
|
|
_pBuf = pTmp;
|
|
}
|
|
|
|
TerminateWithBackSlash( _pBuf, _cchLen );
|
|
}
|
|
|
|
void RemoveBackSlash()
|
|
{
|
|
if ( 0 == _pBuf || 0 == _cchLen || L'\\' != _pBuf[_cchLen-1] )
|
|
{
|
|
return;
|
|
}
|
|
|
|
_pBuf[--_cchLen] = 0;
|
|
}
|
|
|
|
BOOL AreEqual( CLowcaseBuf const & rhs ) const
|
|
{
|
|
return _cchLen == rhs._cchLen &&
|
|
RtlEqualMemory( _pBuf, rhs._pBuf, _cchLen*sizeof(WCHAR) );
|
|
}
|
|
|
|
inline void ForwardToBackSlash();
|
|
|
|
private:
|
|
|
|
WCHAR *_pBuf;
|
|
ULONG _cchLen;
|
|
ULONG _cchSize;
|
|
BOOL _fOwned;
|
|
|
|
enum { CAT_BUF_SIZE = (MAX_PATH + 1) };
|
|
WCHAR _buf[CAT_BUF_SIZE];
|
|
};
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CLowcaseBuf::CLowcaseBuf, public
|
|
//
|
|
// Synopsis: Constructor
|
|
//
|
|
// Arguments: [str] - string to make a lower case copy of.
|
|
//
|
|
// History: 10-Mar-92 BartoszM Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
inline CLowcaseBuf::CLowcaseBuf ( WCHAR const * str ) :
|
|
_cchLen( 0 ),
|
|
_fOwned( TRUE ),
|
|
_cchSize( CAT_BUF_SIZE )
|
|
{
|
|
ULONG cwcIn = wcslen( str );
|
|
ULONG cwcOut = sizeof( _buf ) / sizeof( _buf[0] );
|
|
_pBuf = _buf;
|
|
|
|
if ( 0 == cwcIn )
|
|
{
|
|
_cchLen = 0;
|
|
}
|
|
else
|
|
{
|
|
while ( TRUE )
|
|
{
|
|
ULONG cchLen = LCMapStringW ( LOCALE_NEUTRAL,
|
|
LCMAP_LOWERCASE,
|
|
str,
|
|
cwcIn,
|
|
_pBuf,
|
|
cwcOut - 1 );
|
|
|
|
if ( 0 == cchLen )
|
|
{
|
|
if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
|
|
{
|
|
if ( _pBuf != _buf )
|
|
delete [] _pBuf;
|
|
|
|
cwcOut *= 2;
|
|
_pBuf = new WCHAR[ _cchSize = cwcOut ];
|
|
}
|
|
else
|
|
{
|
|
ciDebugOut(( DEB_ERROR, "Error 0x%x lowercasing path\n", GetLastError() ));
|
|
Win4Assert(( !"neutral lowercase failed" ));
|
|
THROW( CException() );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_cchLen = cchLen;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
_pBuf[_cchLen] = 0;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CLowcaseBuf::CLowcaseBuf, public
|
|
//
|
|
// Synopsis: Constructor, when you need a CLowcaseBuf object and the
|
|
// string is already lowercase.
|
|
//
|
|
// Arguments: [str] -- string to make a lower case copy of.
|
|
// [fLower] -- must be TRUE
|
|
//
|
|
// History: 10-Mar-92 BartoszM Created (really?)
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
inline CLowcaseBuf::CLowcaseBuf (
|
|
WCHAR const * str,
|
|
BOOL fLower ) :
|
|
_cchLen( wcslen( str ) ),
|
|
_pBuf( (WCHAR *) str ),
|
|
_fOwned( FALSE ),
|
|
_cchSize( CAT_BUF_SIZE )
|
|
{
|
|
Win4Assert( fLower );
|
|
|
|
AssertLowerCase( str, _cchLen );
|
|
|
|
} //CLowcaseBuf
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CLowcaseBuf::~CLowcaseBuf, public
|
|
//
|
|
// Synopsis: Destructor (may delete heap buffer)
|
|
//
|
|
// History: 31-May-96 KyleP Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
CLowcaseBuf::~CLowcaseBuf()
|
|
{
|
|
if ( _fOwned && _pBuf != _buf )
|
|
delete [] _pBuf;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CLowcaseBuf::ForwardToBackSlash
|
|
//
|
|
// Synopsis: Converts the forward slashes to back slashes in the string.
|
|
//
|
|
// History: 7-12-96 srikants Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CLowcaseBuf::ForwardToBackSlash()
|
|
{
|
|
for ( ULONG i = 0; i < _cchLen; i++ )
|
|
{
|
|
if ( L'/' == _pBuf[i] )
|
|
{
|
|
_pBuf[i] = L'\\';
|
|
}
|
|
}
|
|
}
|
|
|