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.
 
 
 
 
 
 

113 lines
2.8 KiB

/*
* s i m p s t r . h
*
* Author: Greg Friedman
*
* Purpose: Simple string class.
*
* Copyright (C) Microsoft Corp. 1998.
*/
#include "pch.hxx"
#include "simpstr.h"
//----------------------------------------------------------------------
// CSimpleString::operator==
//----------------------------------------------------------------------
BOOL CSimpleString::operator==(const CSimpleString& rhs) const
{
if (m_pRep == rhs.m_pRep)
return TRUE;
if (!m_pRep || !rhs.m_pRep)
return FALSE;
return (0 == lstrcmp(m_pRep->m_pszString, rhs.m_pRep->m_pszString));
}
//----------------------------------------------------------------------
// CSimpleString::SetString
//----------------------------------------------------------------------
HRESULT CSimpleString::SetString(LPCSTR pszString)
{
_ReleaseRep();
return _AllocateRep(pszString, FALSE);
}
//----------------------------------------------------------------------
// CSimpleString::AdoptString
//----------------------------------------------------------------------
HRESULT CSimpleString::AdoptString(LPSTR pszString)
{
_ReleaseRep();
return _AllocateRep(pszString, TRUE);
}
//----------------------------------------------------------------------
// CSimpleString::_AcquireRep
//----------------------------------------------------------------------
void CSimpleString::_AcquireRep(SRep *pRep)
{
if (m_pRep == pRep)
return;
if (m_pRep)
_ReleaseRep();
if (pRep)
{
m_pRep = pRep;
m_pRep->m_cRef++;
}
}
//----------------------------------------------------------------------
// CSimpleString::_ReleaseRep
//----------------------------------------------------------------------
void CSimpleString::_ReleaseRep(void)
{
if (m_pRep)
{
if (0 == --m_pRep->m_cRef)
{
if (m_pRep->m_pszString)
MemFree(const_cast<LPSTR>(m_pRep->m_pszString));
delete m_pRep;
}
m_pRep = NULL;
}
}
//----------------------------------------------------------------------
// CSimpleString::_AllocateRep
//----------------------------------------------------------------------
HRESULT CSimpleString::_AllocateRep(LPCSTR pszString, BOOL fAdopted)
{
SRep *pRep = NULL;
HRESULT hr = S_OK;
if (pszString)
{
pRep = new SRep;
if (NULL == pRep)
{
hr = E_OUTOFMEMORY;
goto exit;
}
pRep->m_pszString = fAdopted ? pszString : PszDupA(pszString);
if (NULL == pRep->m_pszString)
{
delete pRep;
hr = E_OUTOFMEMORY;
goto exit;
}
pRep->m_cRef = 1;
m_pRep = pRep;
}
exit:
return hr;
}