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.
 
 
 
 
 
 

478 lines
9.0 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (c) 1998-1999 Microsoft Corporation
//
// File: str.cpp
//
//--------------------------------------------------------------------------
//
// string.cpp
#include "str.h"
WORD String::sm_wBlockSize = 16;
String::String()
{
m_wAllocated = 0;
m_pBuf = NULL;
m_wLength = 0;
}
String::String( const String& str )
{
m_wLength = str.m_wLength;
if (m_wLength == 0)
{
m_wAllocated = 0;
m_pBuf = NULL;
}
else
{
m_wAllocated = figureblocksize( m_wLength );
m_pBuf = new WCHAR[m_wAllocated];
if( m_pBuf != NULL )
{
wcscpy( m_pBuf, str.m_pBuf );
}
else
{
m_wLength = 0;
m_wAllocated = 0;
}
}
}
String::String( LPCSTR pszStr )
{
if( pszStr != NULL && pszStr[0] != '\0' )
{
m_wLength = static_cast<WORD>( MultiByteToWideChar( CP_ACP, 0, pszStr, -1, NULL, 0 ) );
m_wAllocated = figureblocksize( m_wLength );
m_pBuf = new WCHAR[m_wAllocated];
if( m_pBuf != NULL )
{
MultiByteToWideChar( CP_ACP, 0, pszStr, -1, m_pBuf, m_wAllocated );
}
else
{
m_wLength = 0;
m_wAllocated = 0;
}
}
else
{
m_wLength = 0;
m_wAllocated = 0;
m_pBuf = NULL;
}
}
String::String( LPCWSTR pszWstr )
{
if( pszWstr != NULL && pszWstr[0] != L'\0')
{
m_wLength = static_cast<WORD>( wcslen(pszWstr) );
m_wAllocated = figureblocksize( m_wLength );
m_pBuf = new WCHAR[m_wAllocated];
if( m_pBuf != NULL )
{
wcscpy(m_pBuf, pszWstr);
}
else
{
m_wLength = 0;
m_wAllocated = 0;
}
}
else
{
m_wLength = 0;
m_wAllocated = 0;
m_pBuf = NULL;
}
}
String::~String()
{
if (m_pBuf) delete[] m_pBuf;
}
String& String::operator=( const String& str )
{
WORD wBlockSize;
if( m_pBuf != str.m_pBuf )
{
if (!str.m_pBuf)
{
if (m_pBuf)
{
m_pBuf[0] = L'\0';
}
m_wLength = 0;
}
else
{
wBlockSize = figureblocksize( str.m_wLength );
if( wBlockSize <= m_wAllocated )
{
m_wLength = str.m_wLength;
wcscpy( m_pBuf, str.m_pBuf );
}
else
{
if (m_pBuf) delete [] m_pBuf;
m_wLength = str.m_wLength;
m_wAllocated = wBlockSize;
m_pBuf = new WCHAR[m_wAllocated];
if( m_pBuf != NULL )
{
wcscpy( m_pBuf, str.m_pBuf );
}
else
{
m_wLength = 0;
m_wAllocated = 0;
}
}
}
}
return *this;
}
String& String::operator=( LPCSTR pszStr )
{
WORD wLength;
WORD wBlockSize;
if( pszStr == NULL )
{
m_wLength = 0;
return *this;
}
wLength = static_cast<WORD>( MultiByteToWideChar( CP_ACP, 0, pszStr, -1, NULL, 0 ) );
wBlockSize = figureblocksize( wLength );
if( wBlockSize <= m_wAllocated )
{
m_wLength = wLength;
MultiByteToWideChar( CP_ACP, 0, pszStr, -1, m_pBuf, m_wAllocated );
}
else
{
if (m_pBuf) delete[] m_pBuf;
m_wLength = wLength;
m_wAllocated = wBlockSize;
m_pBuf = new WCHAR[m_wAllocated];
if( m_pBuf != NULL )
{
MultiByteToWideChar( CP_ACP, 0, pszStr, -1, m_pBuf, m_wAllocated );
}
else
{
m_wLength = 0;
m_wAllocated = 0;
}
}
return *this;
}
String& String::operator=( LPCWSTR pszWstr )
{
WORD wLength;
WORD wBlockSize;
if( pszWstr == NULL )
{
m_wLength = 0;
return *this;
}
wLength = static_cast<WORD>( wcslen( pszWstr ) );
wBlockSize = figureblocksize( wLength );
if( wBlockSize <= m_wAllocated )
{
m_wLength = wLength;
wcscpy(m_pBuf, pszWstr);
}
else
{
if (m_pBuf) delete[] m_pBuf;
m_wLength = wLength;
m_wAllocated = wBlockSize;
m_pBuf = new WCHAR[m_wAllocated];
if( m_pBuf != NULL )
{
wcscpy(m_pBuf, pszWstr);
}
else
{
m_wLength = 0;
m_wAllocated = 0;
}
}
return *this;
}
/*
#ifndef _MAC
BOOL String::LoadString( UINT nID, HINSTANCE hInstance )
{
char szBuf[256]; // this is safe since resource strings
// are limited to 255 characters
if( ::LoadString( hInstance, nID, szBuf, sizeof( szBuf ) ) == 0 )
{
return FALSE;
}
delete[] m_pBuf;
m_wLength = static_cast<WORD>( ::lstrlen( szBuf ) );
m_wAllocated = figureblocksize( m_wLength );
m_pBuf = new WCHAR[m_wAllocated];
if( m_pBuf == NULL )
{
m_wLength = 0;
return FALSE;
}
::lstrcpy( m_pBuf, szBuf );
m_pBuf[m_wLength] = '\0';
return TRUE;
}
#endif
*/
void String::TrimTrailingSpaces()
{
while( m_wLength > 0 && m_pBuf[m_wLength - 1] == ' ' )
{
m_pBuf[m_wLength - 1] = '\0';
--m_wLength;
}
}
void String::Concat( const String& str )
{
if( ( str.m_wLength + m_wLength + 1 ) < m_wAllocated )
{
m_wLength = static_cast<WORD>( m_wLength + str.m_wLength );
wcscat( m_pBuf, str.m_pBuf );
}
else
{
WCHAR* p;
m_wLength = static_cast<WORD>( m_wLength + str.m_wLength );
m_wAllocated = figureblocksize( m_wLength );
p = new WCHAR[m_wAllocated];
if( p != NULL )
{
wcscpy( p, m_pBuf );
wcscat( p, str.m_pBuf );
if (m_pBuf) delete[] m_pBuf;
m_pBuf = p;
}
}
}
void String::Concat( LPCWSTR lpwzStr )
{
int len;
len = wcslen( lpwzStr );
if( ( len + m_wLength + 1 ) < m_wAllocated )
{
m_wLength = static_cast<WORD>( m_wLength + len );
wcscat( m_pBuf, lpwzStr );
}
else
{
WCHAR* p;
m_wLength = static_cast<WORD>( m_wLength + len );
m_wAllocated = figureblocksize( m_wLength );
p = new WCHAR[m_wAllocated];
if( p != NULL )
{
wcscpy( p, m_pBuf );
wcscat( p, lpwzStr );
if (m_pBuf) delete[] m_pBuf;
m_pBuf = p;
}
}
}
void String::Concat( WCHAR wch )
{
WCHAR buf[2];
buf[0] = wch;
buf[1] = '\0';
if( ( 1 + m_wLength + 1 ) < m_wAllocated )
{
m_wLength += 1;
wcscat( m_pBuf, buf );
}
else
{
WCHAR* p;
m_wLength += 1;
m_wAllocated = figureblocksize( m_wLength );
p = new WCHAR[m_wAllocated];
if( p != NULL )
{
wcscpy( p, m_pBuf );
wcscat( p, buf );
if (m_pBuf) delete[] m_pBuf;
m_pBuf = p;
}
}
}
HRESULT String::ReadWCS( LPSTREAM pStream, DWORD cSize )
{
HRESULT hr = S_OK;
WCHAR* wstrText = NULL;
DWORD cb;
WORD wBlockSize;
wstrText = new WCHAR[cSize / sizeof( WCHAR )];
if( NULL == wstrText )
{
hr = E_OUTOFMEMORY;
goto ON_ERR;
}
hr = pStream->Read( reinterpret_cast<LPWSTR>( wstrText ), cSize, &cb );
if( FAILED( hr ) || cb != cSize )
{
hr = E_FAIL;
goto ON_ERR;
}
cSize = wcslen(wstrText);
if (cSize == 0)
{
if (m_pBuf)
{
m_pBuf[0] = L'\0';
}
m_wLength = 0;
goto ON_ERR;
}
wBlockSize = figureblocksize( static_cast<WORD>( cSize ) );
m_wLength = static_cast<WORD>( cSize );
if( wBlockSize <= m_wAllocated )
{
wcscpy( m_pBuf, wstrText );
}
else
{
if (m_pBuf) delete[] m_pBuf;
m_wAllocated = wBlockSize;
m_pBuf = new WCHAR[m_wAllocated];
if( m_pBuf != NULL )
{
wcscpy( m_pBuf, wstrText );
}
else
{
hr = E_OUTOFMEMORY;
m_wLength = 0;
m_wAllocated = 0;
}
}
ON_ERR:
if( wstrText != NULL )
{
delete [] wstrText;
}
return hr;
}
/*
HRESULT String::WriteWCS( LPSTREAM pStream )
{
HRESULT hr;
wchar_t* wstrText;
DWORD cb;
DWORD cSize;
cSize = MultiByteToWideChar( CP_ACP, 0, m_pBuf, -1, NULL, 0 ); // get number of wide characters required
wstrText = new wchar_t[cSize];
if( wstrText == NULL )
{
hr = E_OUTOFMEMORY;
}
else
{
MultiByteToWideChar( CP_ACP, 0, m_pBuf, -1, wstrText, cSize );
hr = pStream->Write( reinterpret_cast<LPSTR>( wstrText ), cSize * sizeof( wchar_t ), &cb );
if( FAILED( hr ) || cb != ( cSize * sizeof( wchar_t ) ) )
{
hr = E_FAIL;
}
else
{
hr = S_OK;
}
delete [] wstrText;
}
return hr;
}
*/
String operator+( const String& str1, const String& str2 )
{
String str;
str = str1;
str.Concat( str2 );
return str;
}
String operator+( const String& str1, LPCSTR lpszStr )
{
String str;
str = str1;
str.Concat( lpszStr );
return str;
}
String operator+( LPCSTR lpszStr, const String& str1 )
{
String str;
str = lpszStr;
str.Concat( str1 );
return str;
}
String operator+( const String& str1, char ch )
{
String str;
str = str1;
str.Concat( ch );
return str;
}
String operator+( char ch, const String& str1 )
{
String str;
str.Concat( ch );
str.Concat( str1 );
return str;
}