//+------------------------------------------------------------------------- // // 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( 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( 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( 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( 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( ::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( m_wLength + str.m_wLength ); wcscat( m_pBuf, str.m_pBuf ); } else { WCHAR* p; m_wLength = static_cast( 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( m_wLength + len ); wcscat( m_pBuf, lpwzStr ); } else { WCHAR* p; m_wLength = static_cast( 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( 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( cSize ) ); m_wLength = static_cast( 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( 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; }