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.
 
 
 
 
 
 

167 lines
3.4 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: U S T R I N G . C P P
//
// Contents: Simple string class
//
// Notes:
//
// Author: mbend 17 Aug 2000
//
//----------------------------------------------------------------------------
#include <pch.h>
#pragma hdrstop
#include "UString.h"
#include "ComUtility.h"
HRESULT CUString::HrAssign(const wchar_t * sz)
{
if(!sz)
{
Clear();
return S_OK;
}
HRESULT hr = S_OK;
wchar_t * szTemp = new wchar_t[lstrlen(sz) + 1];
if(!szTemp)
{
hr = E_OUTOFMEMORY;
}
if(SUCCEEDED(hr))
{
lstrcpy(szTemp, sz);
delete [] m_sz;
m_sz = szTemp;
}
TraceHr(ttidError, FAL, hr, FALSE, "CUString::HrAssign");
return hr;
}
HRESULT CUString::HrAssign(const char * sz)
{
if(!sz)
{
Clear();
return S_OK;
}
HRESULT hr = S_OK;
long nLength = MultiByteToWideChar(CP_ACP, 0, sz, -1, NULL, 0);
wchar_t * szTemp = new wchar_t[nLength];
if(!szTemp)
{
hr = E_OUTOFMEMORY;
}
if(SUCCEEDED(hr))
{
MultiByteToWideChar(CP_ACP, 0, sz, -1, szTemp, nLength);
delete [] m_sz;
m_sz = szTemp;
}
TraceHr(ttidError, FAL, hr, FALSE, "CUString::HrAssign");
return hr;
}
HRESULT CUString::HrAppend(const wchar_t * sz)
{
// Ignore appending a blank/null string
if(!sz)
{
return S_OK;
}
HRESULT hr = S_OK;
long nLength = GetLength() + (sz?lstrlen(sz):0) + 1;
wchar_t * szTemp = new wchar_t[nLength];
if(!szTemp)
{
hr = E_OUTOFMEMORY;
}
if(SUCCEEDED(hr))
{
*szTemp = 0;
if(m_sz)
{
lstrcpy(szTemp, m_sz);
}
if(sz)
{
lstrcat(szTemp, sz);
}
delete [] m_sz;
m_sz = szTemp;
}
TraceHr(ttidError, FAL, hr, FALSE, "CUString::HrAppend");
return hr;
}
HRESULT CUString::HrPrintf(const wchar_t * szFormat, ...)
{
va_list val;
va_start(val, szFormat);
wchar_t buf[1024];
wvsprintf(buf, szFormat, val);
va_end(val);
HRESULT hr = HrAssign(buf);
TraceHr(ttidError, FAL, hr, FALSE, "CUString::HrPrintf");
return hr;
}
long CUString::CcbGetMultiByteLength() const
{
if(!GetLength())
{
return 1;
}
return WideCharToMultiByte(CP_ACP, 0, m_sz, -1, NULL, 0, NULL, NULL);
}
HRESULT CUString::HrGetMultiByte(char * szBuf, long ccbLength) const
{
HRESULT hr = S_OK;
if(!GetLength())
{
*szBuf = '\0';
}
else
{
if(!WideCharToMultiByte(CP_ACP, 0, m_sz, -1, szBuf, ccbLength, NULL, NULL))
{
hr = HrFromLastWin32Error();
}
}
TraceHr(ttidError, FAL, hr, FALSE, "CUString::HrGetMultiByte");
return hr;
}
HRESULT CUString::HrGetMultiByteWithAlloc(char ** pszBuf) const
{
HRESULT hr = S_OK;
long ccbLength = CcbGetMultiByteLength();
char * szBuf = new char[ccbLength];
if(!szBuf)
{
hr = E_OUTOFMEMORY;
}
if(SUCCEEDED(hr))
{
hr = HrGetMultiByte(szBuf, ccbLength);
if(FAILED(hr))
{
delete [] szBuf;
}
if(SUCCEEDED(hr))
{
*pszBuf = szBuf;
}
}
TraceHr(ttidError, FAL, hr, FALSE, "CUString::HrGetMultiByteWithAlloc");
return hr;
}