479 lines
9 KiB
C++
479 lines
9 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// 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;
|
|
}
|