// MultiStrZ.cpp -- Multiple String, zero-terminated class definition. // (c) Copyright Schlumberger Technology Corp., unpublished work, created // 1999. This computer program includes Confidential, Proprietary // Information and is a Trade Secret of Schlumberger Technology Corp. All // use, disclosure, and/or reproduction is prohibited unless authorized // in writing. All Rights Reserved. #include "NoWarning.h" #include "ForceLib.h" #include #include "MultiStrZ.h" using namespace std; /////////////////////////// LOCAL/HELPER ///////////////////////////////// namespace { MultiStringZ::SizeType LengthAccumulator(MultiStringZ::SizeType cInitLength, MultiStringZ::ValueType const &rs) { return cInitLength += rs.length() + 1; // include terminating 0 } MultiStringZ::ValueType & StringAccumulator(MultiStringZ::ValueType &lhs, MultiStringZ::ValueType const &rhs) { // include terminating 0 lhs.append(rhs.c_str(), rhs.length() + 1); return lhs; } MultiStringZ::csSizeType csLengthAccumulator(MultiStringZ::csSizeType cInitLength, MultiStringZ::csValueType const &rs) { return cInitLength += rs.GetLength()+1; //Include terminating 0 } MultiStringZ::csValueType & csStringAccumulator(MultiStringZ::csValueType &lhs, MultiStringZ::csValueType const &rhs) { int lLen = lhs.GetLength(); int rLen = rhs.GetLength(); LPTSTR pBuffer = lhs.GetBufferSetLength(lLen+rLen+1); wcsncpy(pBuffer+lLen,(LPCTSTR)rhs,rLen); *(pBuffer+lLen+rLen) = TCHAR('\0');//The separator between strings lhs.ReleaseBuffer(lLen+rLen+1); return lhs; } } // namespace /////////////////////////// PUBLIC ///////////////////////////////// // Types // C'tors/D'tors MultiStringZ::MultiStringZ() : m_Buffer(), m_csBuffer() {} MultiStringZ::MultiStringZ(vector const &rvs) : m_Buffer(), m_csBuffer() { SizeType cLength = accumulate(rvs.begin(), rvs.end(), 0, LengthAccumulator); if (0 != cLength) { // +1 to account for the zero character ending the list m_Buffer.reserve(cLength + 1); m_Buffer = accumulate(rvs.begin(), rvs.end(), m_Buffer, StringAccumulator); m_Buffer.append(1, 0); // mark end of list } } MultiStringZ::MultiStringZ(vector const &rvs) : m_Buffer(), m_csBuffer() { csSizeType cLength = accumulate(rvs.begin(), rvs.end(), 0, csLengthAccumulator); if (0 != cLength) { m_csBuffer = accumulate(rvs.begin(), rvs.end(), m_csBuffer, csStringAccumulator); } } MultiStringZ::~MultiStringZ() {} // Operators // Operations // Access MultiStringZ::CharType const * MultiStringZ::Data() const { return m_Buffer.c_str(); // use 0 terminated version } MultiStringZ::SizeType MultiStringZ::Length() const { return m_Buffer.length(); } LPCTSTR MultiStringZ::csData() const { return (LPCTSTR)m_csBuffer; } MultiStringZ::csSizeType MultiStringZ::csLength() const { return m_csBuffer.GetLength(); } // Predicates // Static Variables /////////////////////////// PROTECTED ///////////////////////////////// // C'tors/D'tors // Operators // Operations // Access // Predicates // Static Variables /////////////////////////// PRIVATE ///////////////////////////////// // C'tors/D'tors // Operators // Operations // Access // Predicates // Static Variables