You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by db...@apache.org on 2001/06/18 23:36:48 UTC

cvs commit: xml-xalan/c/src/XalanDOM XalanDOMString.cpp XalanDOMString.hpp

dbertoni    01/06/18 14:36:47

  Modified:    c/src/XalanDOM XalanDOMString.cpp XalanDOMString.hpp
  Log:
  Implemented exception throwing for transcoding errors.  Implemented new member functions for better inter-operability with narrow character strings.
  
  Revision  Changes    Path
  1.11      +92 -27    xml-xalan/c/src/XalanDOM/XalanDOMString.cpp
  
  Index: XalanDOMString.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XalanDOM/XalanDOMString.cpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- XalanDOMString.cpp	2001/04/11 20:25:56	1.10
  +++ XalanDOMString.cpp	2001/06/18 21:36:42	1.11
  @@ -132,18 +132,7 @@
   
   	if (*theString != 0)
   	{
  -		if (theCount == size_type(npos))
  -		{
  -            TranscodeFromLocalCodePage(theString, m_data, true);
  -		}
  -		else
  -		{
  -			TranscodeFromLocalCodePage(theString, theCount, m_data, true);
  -		}
  -
  -#if defined(XALAN_DOMSTRING_CACHE_SIZE)
  -		m_size = m_data.size() - 1;
  -#endif
  +		append(theString, theCount);
   	}
   
   	invariants();
  @@ -176,20 +165,6 @@
   
   
   
  -XalanDOMString&
  -XalanDOMString::operator=(const XalanDOMChar*	theRHS)
  -{
  -	erase();
  -
  -	append(theRHS, length(theRHS));
  -
  -	invariants();
  -
  -	return *this;
  -}
  -
  -
  -
   void
   XalanDOMString::resize(
   			size_type		theCount,
  @@ -334,11 +309,75 @@
   
   
   
  +static inline void
  +doTranscode(
  +			const char*					theString,
  +			XalanDOMString::size_type	theCount,
  +			XalanDOMCharVectorType&		theVector)
  +{
  +	assert(theString != 0);
  +
  +	if (theCount == XalanDOMString::size_type(XalanDOMString::npos))
  +	{
  +		if (TranscodeFromLocalCodePage(theString, theVector, true) == false)
  +		{
  +			throw XalanDOMString::TranscodingError();
  +		}
  +	}
  +	else
  +	{
  +		if (TranscodeFromLocalCodePage(theString, theCount, theVector, true) == false)
  +		{
  +			throw XalanDOMString::TranscodingError();
  +		}
  +	}
  +}
  +
  +
  +
  +XalanDOMString&
  +XalanDOMString::append(
  +			const char*		theString,
  +			size_type		theCount)
  +{
  +	invariants();
  +
  +	const size_type		theLength =
  +			theCount == size_type(npos) ? length(theString) : theCount;
  +
  +	if (theLength != 0)
  +	{
  +		if (size() == 0)
  +		{
  +			doTranscode(theString, theCount, m_data);
  +		}
  +		else
  +		{
  +			XalanDOMCharVectorType	theTempVector;
  +
  +			doTranscode(theString, theCount, theTempVector);
  +
  +			append(&*theTempVector.begin(), theTempVector.size());
  +		}
  +
  +	#if defined(XALAN_DOMSTRING_CACHE_SIZE)
  +		m_size = m_data.size() - 1;
  +	#endif
  +	}
  +
  +	invariants();
  +
  +	return *this;
  +}
  +
  +
   XalanDOMString&
   XalanDOMString::append(
   			size_type		theCount,
   			XalanDOMChar	theChar)
   {
  +	invariants();
  +
   	if (m_data.size() == 0)
   	{
   		m_data.insert(m_data.end(), theCount + 1, theChar);
  @@ -373,6 +412,8 @@
   			const XalanDOMChar*		theString,
   			size_type				theCount)
   {
  +	invariants();
  +
   	m_data.insert(getIteratorForPosition(thePosition), theString, theString + theCount);
   
   #if defined(XALAN_DOMSTRING_CACHE_SIZE)
  @@ -392,6 +433,8 @@
   			size_type		theCount,
   			XalanDOMChar	theChar)
   {
  +	invariants();
  +
   	m_data.insert(getIteratorForPosition(thePosition), theCount, theChar);
   
   #if defined(XALAN_DOMSTRING_CACHE_SIZE)
  @@ -410,6 +453,8 @@
   			iterator		thePosition,
   			XalanDOMChar	theChar)
   {
  +	invariants();
  +
   	m_data.insert(thePosition, theChar);
   
   #if defined(XALAN_DOMSTRING_CACHE_SIZE)
  @@ -429,6 +474,8 @@
   			size_type		theCount,
   			XalanDOMChar	theChar)
   {
  +	invariants();
  +
   	m_data.insert(thePosition, theCount, theChar);
   
   #if defined(XALAN_DOMSTRING_CACHE_SIZE)
  @@ -446,6 +493,8 @@
   		const_iterator	theFirstPosition,
   		const_iterator	theLastPosition)
   {
  +	invariants();
  +
   	m_data.insert(theInsertPosition, theFirstPosition, theLastPosition);
   
   #if defined(XALAN_DOMSTRING_CACHE_SIZE)
  @@ -548,7 +597,10 @@
   
   	CharVectorType	theResult;
   
  -	TranscodeToLocalCodePage(c_str(), length(), theResult, true);
  +	if (TranscodeToLocalCodePage(c_str(), length(), theResult, true) == false)
  +	{
  +		throw TranscodingError();
  +	}
   
   	return theResult;
   }
  @@ -639,6 +691,16 @@
   
   
   
  +XalanDOMString::size_type
  +XalanDOMString::length(const char*	theString)
  +{
  +	assert(theString != 0);
  +
  +	return strlen(theString);
  +}
  +
  +
  +
   #if defined(XALAN_USE_XERCES_LOCAL_CODEPAGE_TRANSCODERS)
   
   
  @@ -697,6 +759,9 @@
   
   	do
   	{
  +		// $$$ ToDo: We should use the Xerces transcoder interface
  +		// instead of XMLString::transcode(), so we can better control
  +		// error handling and failures due to inadequate space.
   		fSuccess = XMLString::transcode(
   					theRealSourceString,
   					&*theTargetVector.begin(),
  
  
  
  1.16      +92 -44    xml-xalan/c/src/XalanDOM/XalanDOMString.hpp
  
  Index: XalanDOMString.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XalanDOM/XalanDOMString.hpp,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- XalanDOMString.hpp	2001/06/14 18:52:35	1.15
  +++ XalanDOMString.hpp	2001/06/18 21:36:43	1.16
  @@ -67,6 +67,10 @@
   
   
   
  +#include <XalanDOM/XalanDOMException.hpp>
  +
  +
  +
   // UTF-16 character...
   typedef unsigned short	XalanDOMChar;
   
  @@ -136,38 +140,25 @@
   	XalanDOMString&
   	operator=(const XalanDOMString&	theRHS)
   	{
  -		if (&theRHS != this)
  -		{
  -			m_data = theRHS.m_data;
  -
  -#if defined(XALAN_DOMSTRING_CACHE_SIZE)
  -			m_size = theRHS.m_size;
  -#endif
  -		}
  -
  -		invariants();
  +		return assign(theRHS);
  +	}
   
  -		return *this;
  +	XalanDOMString&
  +	operator=(const XalanDOMChar*	theRHS)
  +	{
  +		return assign(theRHS);
   	}
   
   	XalanDOMString&
  -	operator=(const XalanDOMChar*	theRHS);
  +	operator=(const char*	theRHS)
  +	{
  +		return assign(theRHS);
  +	}
   
   	XalanDOMString&
   	operator=(XalanDOMChar	theRHS)
   	{
  -		m_data.resize(2);
  -
  -		m_data[0] = theRHS;
  -		m_data[1] = XalanDOMChar(0);
  -
  -#if defined(XALAN_DOMSTRING_CACHE_SIZE)
  -		m_size = 1;
  -#endif
  -
  -		invariants();
  -
  -		return *this;
  +		return assign(1, theRHS);
   	}
   
   	iterator
  @@ -365,24 +356,18 @@
   	XalanDOMString&
   	operator+=(const XalanDOMString&	theSource)
   	{
  -		invariants();
  -
   		return append(theSource);
   	}
   
   	XalanDOMString&
   	operator+=(const XalanDOMChar*	theString)
   	{
  -		invariants();
  -
   		return append(theString);
   	}
   
   	XalanDOMString&
   	operator+=(XalanDOMChar theChar)
   	{
  -		invariants();
  -
   		append(1, theChar);
   
   		return *this;
  @@ -415,18 +400,49 @@
   	}
   
   	XalanDOMString&
  +	assign(const char*	theSource)
  +	{
  +		invariants();
  +
  +		erase();
  +
  +		invariants();
  +
  +		return append(theSource);
  +	}
  +
  +	XalanDOMString&
   	assign(
  +			const char*		theSource,
  +			size_type		theCount)
  +	{
  +		invariants();
  +
  +		erase();
  +
  +		invariants();
  +
  +		return append(theSource, theCount);
  +	}
  +
  +	XalanDOMString&
  +	assign(
   			const XalanDOMString&	theSource,
   			size_type				thePosition,
   			size_type				theCount)
   	{
   		invariants();
   
  -		erase();
  +		if (&theSource != this)
  +		{
  +			erase();
   
  +			append(theSource, thePosition, theCount);
  +		}
  +
   		invariants();
   
  -		return append(theSource, thePosition, theCount);
  +		return *this;
   	}
   
   	XalanDOMString&
  @@ -434,7 +450,14 @@
   	{
   		invariants();
   
  -		m_data = theSource.m_data;
  +		if (&theSource != this)
  +		{
  +			m_data = theSource.m_data;
  +
  +#if defined(XALAN_DOMSTRING_CACHE_SIZE)
  +			m_size = theSource.m_size;
  +#endif
  +		}
   
   		invariants();
   
  @@ -463,8 +486,6 @@
   	XalanDOMString&
   	append(const XalanDOMString&	theSource)
   	{
  -		invariants();
  -
   		return append(theSource.c_str(), theSource.length());
   	}
   
  @@ -474,7 +495,8 @@
   			size_type				thePosition,
   			size_type				theCount)
   	{
  -		invariants();
  +		assert(thePosition < theSource.length() &&
  +			   (theCount == size_type(npos) || thePosition + theCount <= theSource.length()));
   
   		return append(theSource.c_str() + thePosition, theCount);
   	}
  @@ -487,10 +509,17 @@
   	XalanDOMString&
   	append(const XalanDOMChar*	theString)
   	{
  -		assert(theString != 0);
  +		return append(theString, length(theString));
  +	}
   
  -		invariants();
  +	XalanDOMString&
  +	append(
  +			const char*		theString,
  +			size_type		theCount);
   
  +	XalanDOMString&
  +	append(const char*	theString)
  +	{
   		return append(theString, length(theString));
   	}
   
  @@ -514,8 +543,6 @@
   			size_type				thePosition,
   			const XalanDOMString&	theString)
   	{
  -		invariants();
  -
   		return insert(thePosition, theString.c_str(), theString.length());
   	}
   
  @@ -526,8 +553,6 @@
   			size_type				thePosition2,
   			size_type				theCount)
   	{
  -		invariants();
  -
   		return insert(thePosition1, theString.c_str() + thePosition2, theCount);
   	}
   
  @@ -542,8 +567,6 @@
   			size_type				thePosition,
   			const XalanDOMChar*		theString)
   	{
  -		invariants();
  -
   		return insert(thePosition, theString, length(theString));
   	}
   
  @@ -707,6 +730,31 @@
   	 */
   	static size_type
   	length(const XalanDOMChar*	theString);
  +
  +	/*
  +	 * Helper function to determine the length of a null-
  +	 * terminated string.
  +	 *
  +	 * @theString The string
  +	 * @return the length
  +	 */
  +	static size_type
  +	length(const char*	theString);
  +
  +	class TranscodingError : public XalanDOMException
  +	{
  +	public:
  +
  +		TranscodingError() :
  +			XalanDOMException(ExceptionCode::TRANSCODING_ERR)
  +		{
  +		}
  +
  +		virtual
  +		~TranscodingError()
  +		{
  +		}
  +	};
   
   protected:
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org