Leaked source code of windows server 2003
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.
|
|
//+---------------------------------------------------------------------------
//
// Copyright (C) 1996-1998, Microsoft Corporation.
//
// File: string.hxx
//
// Contents: Yet another string class
//
// History: 96/Jan/3 DwightKr Created
//
//----------------------------------------------------------------------------
#pragma once
#include <ci64.hxx>
//+---------------------------------------------------------------------------
//
// Class: CVirtualString
//
// Purpose: Maintains a WCHAR string buffer as a virtual allocation
// and grows & commits it as necessary. This class should
// be used whenever you need a string buffer which will be
// slowly grow by appending new strings to it ... such as with
// the construction of query results in a HTML page.
//
// History: 96/Jan/23 DwightKr Created
//
//----------------------------------------------------------------------------
class CVirtualString { public: CVirtualString( unsigned cwcBuffer = 2048 );
~CVirtualString();
WCHAR const * Get() const { Win4Assert( _wcsEnd <= _pwcLastCommitted );
*_wcsEnd = 0; return _wcsString; }
WCHAR * GetPointer() const { Win4Assert( _wcsEnd <= _pwcLastCommitted );
*_wcsEnd = 0; return _wcsString; }
void StrCat( WCHAR const * wcsString ) { StrCat( wcsString, wcslen( wcsString ) ); }
void StrCat( WCHAR const * wcsString, ULONG cwcValue ) { Win4Assert( ( 0 != wcsString ) || ( 0 == cwcValue ) );
if ( ( _wcsEnd + cwcValue ) >= _pwcLastCommitted ) GrowBuffer( cwcValue + 1 );
RtlCopyMemory( _wcsEnd, wcsString, cwcValue * sizeof WCHAR );
_wcsEnd += cwcValue;
Win4Assert( (_wcsEnd - _wcsString) < (int) _cwcBuffer ); }
void CharCat( WCHAR wcChar ) { Win4Assert( 0 != wcChar ); Win4Assert( _wcsEnd <= _pwcLastCommitted );
if ( _wcsEnd != _pwcLastCommitted ) { // duplicate the assignment to avoid a branch
*_wcsEnd++ = wcChar;
Win4Assert( (_wcsEnd - _wcsString) < (int) _cwcBuffer );
return; }
GrowBuffer( 1 );
*_wcsEnd++ = wcChar;
Win4Assert( (_wcsEnd - _wcsString) < (int) _cwcBuffer ); }
WCHAR * StrDup() const { WCHAR * wcsString = new WCHAR[ StrLen() + 1 ];
RtlCopyMemory( wcsString, _wcsString, StrLen() * sizeof(WCHAR) );
wcsString[ StrLen() ] = 0;
return wcsString; }
unsigned StrLen() const { return CiPtrToUint( _wcsEnd - _wcsString ); }
void Empty() { Win4Assert( 0 != _wcsString ); Win4Assert( _wcsEnd <= _pwcLastCommitted );
_wcsEnd = _wcsString; *_wcsEnd = 0; }
private:
void GrowBuffer( ULONG cwcToGrow );
WCHAR * _wcsString; // Start of the string
WCHAR * _wcsEnd; // Next place to strcat new data
WCHAR * _pwcLastCommitted; // Pointer to last committed WCHAR
unsigned _cwcBuffer; // Total size of virtual alloc'ed memory
};
void URLEscapeW( WCHAR const * wcsString, CVirtualString & StrResult, ULONG ulCodepage, BOOL fConvertSpaceToPlus = FALSE );
void URLEscapeMToW( BYTE const * psz, unsigned cc, CVirtualString & StrResult, BOOL fConvertSpaceToPlus = FALSE );
|