mystring.cpp

来自「Pegasus is an open-source implementation」· C++ 代码 · 共 546 行

CPP
546
字号
//%2006//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation, The Open Group.// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; Symantec Corporation; The Open Group.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions:// // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.////==============================================================================//// Author: Barbara Packard (barbara_packard@hp.com)//// Modified By: Jair Santos, Hewlett-Packard Company (jair.santos@hp.com)////%/////////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include <Pegasus/Common/Config.h>#include "MyString.h"PEGASUS_NAMESPACE_BEGIN/////////////////////////////////////////////////////////////////////////////// CMyStringvoid CMyString::Init() {    m_pszData = NULL;    m_nStrLen = 0;	m_nBufLen = 0;	m_nStatus = S_OK;}/////////////////////////////////////////////////////////////////////////////// Construction/DestructionCMyString::CMyString()	{	Init();}CMyString::CMyString(const CMyString& strSrc)	{	Init();	*this = strSrc.m_pszData;}CMyString::CMyString(const unsigned char* psz)	{	Init();	*this = (LPCSTR)psz;}CMyString::CMyString(LPCTSTR psz)	{	Init();	*this = psz;}CMyString::CMyString(String sStr){	Init();	CString str = sStr.getCString();	*this = (const char *)str;}#ifdef _UNICODECMyString::CMyString(LPCSTR lpsz)	{	Init();    int nLen = ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpsz, -1, NULL, 0);	AllocBuffer(nLen);    ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpsz, -1, m_pszData, m_nBufLen);	m_nStrLen = _tcslen(m_pszData);}#endifCMyString::~CMyString()	{	//free any pointers	DeallocBuffer();}/////////////////////////////////////////////////////////////////////////////// HelpersBOOL CMyString::AllocBuffer(int nLen){	// always allocate one extra character for '\0' termination	if (m_nBufLen > nLen)	{		return TRUE;	}	Init();	if (nLen > 0)	{		m_pszData = (LPTSTR)new BYTE[(nLen + 1) * sizeof(TCHAR)];	}	if (m_pszData)		{		m_nBufLen = nLen + 1;		memset((void *)m_pszData, '\0', (nLen + 1) * sizeof(TCHAR));	}	else	{		m_nStatus = E_OUTOFMEMORY;		return FALSE;	}		return TRUE;}void CMyString::DeallocBuffer()	{	if (m_pszData)	{		delete [] m_pszData;	}	Init();}void CMyString::AllocBeforeWrite(int nLen){	if (m_pszData && (m_nBufLen > nLen))	{		memset((void *)m_pszData, '\0', m_nBufLen);		return;			}	else	{		DeallocBuffer();		AllocBuffer(nLen);	}}void CMyString::AssignCopy( int nLen, LPCTSTR lpsz){	AllocBeforeWrite(nLen);	if (m_pszData)	{		memcpy(m_pszData, lpsz, nLen * sizeof(TCHAR));		m_pszData[nLen] = '\0';		m_nStrLen = nLen;	}}/////////////////////////////////////////////////////////////////////////////// Overloaded operatorsconst CMyString& CMyString::operator=(const CMyString& stringSrc){	*this = stringSrc.m_pszData;	return *this;}#ifdef _UNICODEconst CMyString& CMyString::operator=(LPCSTR lpsz){    int nLen = ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpsz, -1, NULL, 0);	AllocBeforeWrite(nLen);    if (m_pszData)	{		::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpsz, -1, m_pszData, m_nBufLen);		m_nStrLen = _tcslen(m_pszData);	}	return *this;}#elseconst CMyString& CMyString::operator=(LPCWSTR lpsz)	{    if (lpsz && *lpsz) 	{	    int nLen = ::WideCharToMultiByte(CP_UTF8, 0, lpsz, -1, NULL, 0, NULL, NULL);        AllocBeforeWrite(nLen);        if (m_pszData) 		{            ::WideCharToMultiByte(CP_UTF8, 0, lpsz, -1, m_pszData, m_nBufLen, NULL, NULL);            m_nStrLen = _tcslen(m_pszData);        }    }    else    {        Empty();    }		return *this;}#endif//By Jair - hereconst CMyString& CMyString::operator=(BSTR bStr){    _bstr_t bstr(bStr, TRUE);    *this = (LPCWSTR)bstr;	return *this;}const CMyString& CMyString::operator=(LPCTSTR lpsz){	int nLen = (lpsz != NULL) ? _tcslen(lpsz) : 0;	AssignCopy( nLen, lpsz);	return *this;}const CMyString& CMyString::operator=(const unsigned char* psz){	*this = (LPCSTR)psz;	return *this;}const CMyString& CMyString::operator=(String sStr){	CString str = sStr.getCString();	*this = (const char *)str;	return *this;}CMyString::operator LPCTSTR() const	{	return m_pszData;}/////////////////////////////////////////////////////////////////////////////// string concatenationvoid CMyString::ConcatCopy(	int nLen1, LPCTSTR lpszSrc1, 							int nLen2, LPCTSTR lpszSrc2){	// concatenate two sources	// assumes 'this' is a new CMyString	int nLen = nLen1 + nLen2;	if (nLen != 0)	{		AllocBuffer(nLen);		memcpy(m_pszData, lpszSrc1, nLen1 * sizeof(TCHAR));		memcpy(m_pszData + nLen1, lpszSrc2, nLen2 * sizeof(TCHAR));		m_nStrLen = nLen;	}}void CMyString::ConcatInPlace(int nSrcLen, LPCTSTR lpszSrc)	{	if (nSrcLen == 0)		return;	int nLen = m_nStrLen + nSrcLen;	if (nLen < m_nBufLen)	{		// have enough room, just add it		memcpy(m_pszData + m_nStrLen, lpszSrc, nSrcLen * sizeof(TCHAR));		m_nStrLen = nLen;		m_pszData[nLen] = '\0';	}	else	{			// buffer is too small - reallocate.		LPTSTR pszOld = m_pszData;		ConcatCopy(m_nStrLen, m_pszData, nSrcLen, lpszSrc);		if (pszOld != NULL)			delete [] pszOld;	}}const CMyString& CMyString::operator+=(const CMyString& stringSrc)	{	ConcatInPlace(stringSrc.m_nStrLen, stringSrc.m_pszData);	return *this;}#ifdef _UNICODEconst CMyString& CMyString::operator+=(LPCTSTR lpsz){	if (lpsz != NULL)	{		ConcatInPlace(_tcslen(lpsz), lpsz);	}	return *this;}#else	//!_UNICODEconst CMyString& CMyString::operator+=(LPCTSTR lpsz){	if (lpsz != NULL)	{		CMyString myStr = lpsz;		ConcatInPlace(_tcslen(lpsz), myStr.m_pszData);	}	return *this;}#endifconst CMyString& CMyString::operator+=(String sStr){	if (sStr.size() != 0)	{		CMyString myStr = sStr;		ConcatInPlace(_tcslen((LPCTSTR)myStr), myStr.m_pszData);	}	return *this;}/////////////////////////////////////////////////////////////////////////////// OperationsLPTSTR CMyString::Copy(){	LPTSTR lpsz = new TCHAR[m_nStrLen+1];	if (lpsz)	{		_tcscpy(lpsz, m_pszData);	}	else	{		m_nStatus = (m_nStatus == S_OK) ? E_OUTOFMEMORY : m_nStatus;	}	return lpsz;}//By Jair - hereBSTR CMyString::Bstr(){	CComBSTR cb = (LPCSTR)m_pszData;	return cb.Copy();}BOOL CMyString::Compare(BSTR bStr){	_bstr_t sText1(m_pszData);	_bstr_t sText2(bStr);	return (sText1 == sText2);}BOOL CMyString::Compare(LPCTSTR szStr)	{	_bstr_t sText1(m_pszData);	_bstr_t sText2(szStr);	return (sText1 == sText2);}/////////////////////////////////////////////////////////////////////////////// Search for a character//	lifted from CString//		returns 0 based index of first instance else -1//int CMyString::Find(TCHAR ch) const{	return Find(ch, 0);}int CMyString::Find(TCHAR ch, int nStart) const{	if (nStart >= m_nStrLen)	{		return -1;	}	// find first single character	LPTSTR lpsz = _tcschr(m_pszData + nStart, (_TUCHAR)ch);	return (NULL == lpsz) ? -1 : (int)(lpsz - m_pszData);}/////////////////////////////////////////////////////////////////////////////// Windows extensions to strings//	lifted from CString/*BOOL CMyString::LoadString(UINT nID){	// This is all done in char so it will work in Win95 too	// try fixed buffer first (to avoid wasting space in the heap)	char szTemp[BUF_MAX];	int nLen = ::LoadStringA(_Module.m_hInstResource, nID, szTemp, sizeof(szTemp));	if (sizeof(szTemp) - nLen > CHAR_FUDGE)	{		*this = szTemp;		return nLen > 0;	}	// try buffer size of 512, then larger size until entire string is retrieved	int nSize = BUF_MAX;	LPSTR lpbuf = NULL;	do	{		nSize += BUF_MAX;		if (lpbuf) delete [] lpbuf;		lpbuf = new char[nSize];		if (lpbuf == NULL)	{			nLen = 0;			m_nStatus = (m_nStatus == S_OK) ? E_OUTOFMEMORY : m_nStatus;			break;		}		nLen = ::LoadStringA(_Module.m_hInstResource, nID, lpbuf, nSize);	} while (nSize - nLen <= CHAR_FUDGE);	if (lpbuf)	{		*this = lpbuf;		delete [] lpbuf;	}	return nLen > 0;}*////////////////////////////////////////////////////////////////////////////////	method to format data buffer in printable hex format "xx xx xx "//	lifted from snmp++//	len - number of bytes to formatvoid CMyString::GetPrintableHex(int len, const unsigned char* data){	LPTSTR lpsz = new TCHAR[3 * len + 1];	//2 chars for each byte plus space between	LPTSTR ptr = lpsz;	const unsigned char* bytes = data;	int i;	if (lpsz)	{		for (i = 0; i < len; i++)		{			_stprintf(ptr, _T("%2.2X "), *bytes);			bytes++;			ptr += 3;		}		*ptr = '\0';	}	else	{		m_nStatus = (m_nStatus == S_OK) ? E_OUTOFMEMORY : m_nStatus;	}	if (lpsz)	{		*this = lpsz;		delete[] lpsz;	}}///////////////////////////////////////////////////////////////////////////////	methods to format data buffer as in sprintf.//		NOTE:  iSize is size of output buffer in TCHAR format. Only iSize//		characters will be copied.//		uses _vsntprintf//		returns number of characters in formatted string//	protected method which calls _vsntprintfint CMyString::FormatV(LPCTSTR lpszFormat, int iSize, va_list argList){	int		iNumChars, iLen;	LPTSTR	lpBuf = NULL;	iLen = iSize - CHAR_FUDGE;	lpBuf = new TCHAR[iSize];	iNumChars = _vsntprintf(lpBuf, iLen, lpszFormat, argList);		if (0 <= iNumChars)	{		*this = lpBuf;	}		delete [] lpBuf;	return iNumChars;}// uses sprintf formatint CMyString::Format(LPCTSTR lpszFormat, int iSize, ...){	int iNumChars;	va_list	argList;	va_start(argList, iSize);	iNumChars = FormatV(lpszFormat, iSize, argList);	va_end(argList);	return iNumChars;}/*// uses resource IDint CMyString::Format(UINT nID, int iSize, ...){	int iNumChars;	CMyString s;	va_list argList;	s.LoadString(nID);	va_start(argList, iSize);	iNumChars = FormatV(s, iSize, argList);	va_end(argList);	return iNumChars;}*/PEGASUS_NAMESPACE_END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?