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...@locus.apache.org on 2000/12/01 23:13:29 UTC

cvs commit: xml-xalan/c/src/PlatformSupport DOMStringHelper.cpp DOMStringHelper.hpp

dbertoni    00/12/01 14:13:27

  Modified:    c/src/PlatformSupport DOMStringHelper.cpp
                        DOMStringHelper.hpp
  Log:
  Code cleanup and new number/string conversion routines.
  
  Revision  Changes    Path
  1.46      +414 -194  xml-xalan/c/src/PlatformSupport/DOMStringHelper.cpp
  
  Index: DOMStringHelper.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/DOMStringHelper.cpp,v
  retrieving revision 1.45
  retrieving revision 1.46
  diff -u -r1.45 -r1.46
  --- DOMStringHelper.cpp	2000/11/29 21:34:54	1.45
  +++ DOMStringHelper.cpp	2000/12/01 22:13:20	1.46
  @@ -122,8 +122,11 @@
   // number strings when we don't have to,
   const size_t	MAX_PRINTF_DIGITS = 100;
   
  +// The maximum number of characters for a floating point number.
  +const size_t	MAX_FLOAT_CHARACTERS = 100;
   
   
  +
   #if !defined(XALAN_LSTRSUPPORT)
   
   
  @@ -153,8 +156,12 @@
   
   static XalanDOMString	thePositiveInfinityString;
   
  +static XalanDOMString	theNegativeZeroString;
  +
  +static XalanDOMString	thePositiveZeroString;
   
   
  +
   /**
    * Initialize static data.  Must be called before any
    * other functions are called.  See PlatformSupportInit.
  @@ -165,6 +172,8 @@
   	theNaNString = XALAN_STATIC_UCODE_STRING("NaN");
   	theNegativeInfinityString = XALAN_STATIC_UCODE_STRING("-Infinity");
   	thePositiveInfinityString = XALAN_STATIC_UCODE_STRING("Infinity");
  +	theNegativeZeroString = XALAN_STATIC_UCODE_STRING("-0");
  +	thePositiveZeroString = XALAN_STATIC_UCODE_STRING("0");
   }
   
   
  @@ -179,6 +188,8 @@
   	clear(theNaNString);
   	clear(theNegativeInfinityString);
   	clear(thePositiveInfinityString);
  +	clear(theNegativeZeroString);
  +	clear(thePositiveZeroString);
   }
   
   
  @@ -403,8 +414,7 @@
   
   	const unsigned int	theSubStringLength = length(theSubstring);
   
  -	// If either string is of length 0, or if the substring
  -	// is longer, there's no point in continuing.
  +	// If the substring is longer, there's no point in continuing.
   	if (theStringLength >= theSubStringLength)
   	{
   		int		i = theStringLength - 1;
  @@ -451,7 +461,7 @@
   #else
   			std::ostream&			theStream,
   #endif
  -			 const CharVectorType&	theString)
  +			const CharVectorType&	theString)
   {
   	if (theString.size() > 0)
   	{
  @@ -520,48 +530,54 @@
   
   #if defined(XALAN_NO_ALGORITHMS_WITH_BUILTINS)
   
  -template<class OutputIteratorType>
  -inline void
  +template<class InputIteratorType, class OutputIteratorType>
  +inline OutputIteratorType
   XalanCopy(
  -			const char*			begin,
  -			const char*			end,
  +			InputIteratorType	begin,
  +			InputIteratorType	end,
   			OutputIteratorType	iterator)
   {
   	for(; begin != end; ++iterator, ++begin)
   	{
   		*iterator = *begin;
   	}
  +
  +	return iterator;
   }
   
   
   
  -template<class OutputIteratorType>
  -inline void
  +template<class InputIteratorType, class OutputIteratorType>
  +inline OutputIteratorType
   XalanCopy(
  -			const XalanDOMChar*		begin,
  -			const XalanDOMChar*		end,
  +			InputIteratorType		begin,
  +			InputIteratorType		end,
   			OutputIteratorType		iterator)
   {
   	for(; begin != end; ++iterator, ++begin)
   	{
   		*iterator = *begin;
   	}
  +
  +	return iterator;
   }
   
   
   
  -template<class OutputIteratorType, class UnaryFunction>
  -inline void
  +template<class InputIteratorType, class OutputIteratorType, class UnaryFunction>
  +inline OutputIteratorType
   XalanTransform(
  -			const XalanDOMChar*		begin,
  -			const XalanDOMChar*		end,
  -			OutputIteratorType		iterator,
  -			UnaryFunction			function)
  +			InputIteratorType	begin,
  +			InputIteratorType	end,
  +			OutputIteratorType	iterator,
  +			UnaryFunction		function)
   {
   	for(; begin != end; ++iterator, ++begin)
   	{
   		*iterator = function(*begin);
   	}
  +
  +	return iterator;
   }
   
   #endif
  @@ -598,6 +614,9 @@
   		{
   			assert(theStartIndex + theLength <= theStringLength);
   
  +#if defined(XALAN_USE_CUSTOM_STRING) || defined(XALAN_USE_STD_STRING)
  +			return theString.substr(theStartIndex, theLength);
  +#else
   			// @@ JMD:
   			// If this is the case, the DOMString class doesn't create a new string,
   			// and in any case, does not null terminate the string, just points to
  @@ -605,6 +624,8 @@
   			// and create a new buffer
   			if (0 == theStartIndex)
   			{
  +				const XalanDOMChar* const	ptr = toCharArray(theString);
  +
   				vector<XalanDOMChar>	theBuffer;
   
   				// Reserve the buffer now.  We don't have to null-terminate,
  @@ -612,8 +633,6 @@
   				// parameter.
   				theBuffer.reserve(theLength);
   
  -				const XalanDOMChar* const	ptr = toCharArray(theString);
  -
   #if defined(XALAN_NO_ALGORITHMS_WITH_BUILTINS)
   				XalanCopy(
   					ptr,
  @@ -626,22 +645,44 @@
   					back_inserter(theBuffer));
   #endif
   
  -				return XalanDOMString(theBuffer.begin(), theBuffer.size());
  +				return XalanDOMString(&*theBuffer.begin(), theBuffer.size());
   			}
   			else
   			{
  -#if defined(XALAN_USE_CUSTOM_STRING) || defined(XALAN_USE_STD_STRING)
  -				return theString.substr(theStartIndex, theLength);
  -#else
   				return theString.substringData(theStartIndex, theLength);
  -#endif
   			}
  +#endif	// defined(XALAN_USE_CUSTOM_STRING) || defined(XALAN_USE_STD_STRING)
   		}
   	}
   }
   
   
   
  +template <class InputIteratorType, class OutputIteratorType, class FunctionType>
  +OutputIteratorType
  +TransformString(
  +			InputIteratorType	theInputBegin,
  +			InputIteratorType	theInputEnd,
  +			OutputIteratorType	theOutputIterator,
  +			FunctionType		theFunction)
  +{
  +#if defined(XALAN_NO_ALGORITHMS_WITH_BUILTINS)
  +	return XalanTransform(
  +			theInputBegin,
  +			theInputEnd,
  +			theOutputIterator,
  +			theFunction);
  +#else
  +	return transform(
  +			theInputBegin,
  +			theInputEnd,
  +			theOutputIterator,
  +			theFunction);
  +#endif
  +}
  +
  +
  +
   template <class SizeType, class FunctionType>
   XalanDOMString
   TransformString(
  @@ -651,23 +692,27 @@
   {
   	assert(theInputString != 0);
   
  +#if defined(XALAN_USE_XERCES_DOMSTRING)
   	vector<XalanDOMChar>	theConvertedString;
   
  -#if defined(XALAN_NO_ALGORITHMS_WITH_BUILTINS)
  -		XalanTransform(
  +	TransformString(
   			theInputString,
   			theInputString + theInputStringLength,
   			back_inserter(theConvertedString),
   			theFunction);
  +
  +	return XalanDOMString(&*theConvertedString.begin(), theConvertedString.size());
   #else
  -		transform(
  +	XalanDOMString	theConvertedString;
  +
  +	TransformString(
   			theInputString,
   			theInputString + theInputStringLength,
   			back_inserter(theConvertedString),
   			theFunction);
  -#endif
   
  -	return XalanDOMString(theConvertedString.begin(), theConvertedString.size());
  +	return theConvertedString;
  +#endif
   }
   
   
  @@ -695,7 +740,6 @@
   
   
   
  -
   XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(XalanDOMString)
   toLowerCase(const XalanDOMChar*		theString)
   {
  @@ -1443,7 +1487,7 @@
   Type
   WideStringToIntegral(
   			const XalanDOMChar*		theString,
  -			Type					theDummy)
  +			Type					/* theDummy */)
   {
   	if (theString == 0)
   	{
  @@ -1523,7 +1567,7 @@
   	const int	strLen = length(theString);
   	
   	// index of first non-whitespace character
  -	int leadingSpace = 0;
  +	int			leadingSpace = 0;
   
   	for (; leadingSpace < strLen; ++leadingSpace)
   		if (!isXMLWhitespace(charAt(theString, leadingSpace)))
  @@ -1541,257 +1585,433 @@
   
   
   
  -XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(XalanDOMString)
  -DoubleToDOMString(double	theDouble)
  +template <class InputCharType, class OutputCharType>
  +class IdentityTransform
   {
  -	if (DoubleSupport::isNaN(theDouble) == true)
  -	{
  -		return theNaNString;
  -	}
  -	else if (DoubleSupport::isPositiveInfinity(theDouble) == true)
  -	{
  -		return thePositiveInfinityString;
  -	}
  -	else if (DoubleSupport::isNegativeInfinity(theDouble) == true)
  +public:
  +
  +	OutputCharType
  +	operator()(InputCharType	theChar) const
   	{
  -		return theNegativeInfinityString;
  +		return OutputCharType(theChar);
   	}
  -	else
  +};
  +
  +
  +
  +template<class InputCharType, class OutputCharType>
  +IdentityTransform<InputCharType, OutputCharType>
  +makeIdentityTransform(
  +			const InputCharType*,
  +			const OutputCharType*)
  +{
  +	return IdentityTransform<InputCharType, OutputCharType>();
  +}
  +
  +
  +
  +// A very cheap decimal number transcoder...
  +template <class InputCharType, class OutputCharType>
  +class DecimalNumberTranscodeTransform
  +{
  +public:
  +
  +	OutputCharType
  +	operator()(InputCharType	theChar) const
   	{
  -		// $$$ ToDo: this is all temporary, until we get the NumberFormat and DecimalFormat
  -		// classes working.
  -		// According to the XPath standard, any values without
  -		// a fractional part are printed as integers.
  -		double	intPart = 0;
  +		switch(theChar)
  +		{
  +		case '-':
  +			return OutputCharType(XalanUnicode::charHyphenMinus);
  +			break;
   
  -		double	fracPart = fabs(modf(theDouble, &intPart));
  +		case '.':
  +			return OutputCharType(XalanUnicode::charFullStop);
  +			break;
   
  -		char		theBuffer[MAX_PRINTF_DIGITS + 1];
  +		case '0':
  +			return OutputCharType(XalanUnicode::charDigit_0);
  +			break;
   
  -#if 1
  -		sprintf(theBuffer, "%f", theDouble);
  -#else
  -		ostrstream	theFormatter(theBuffer, sizeof(theBuffer));
  +		case '1':
  +			return OutputCharType(XalanUnicode::charDigit_1);
  +			break;
   
  -		// Ensure that we get fixed point results, and that there's enough precision.
  -		theFormatter.flags((theFormatter.flags() & ~ios::scientific) | ios::fixed);
  +		case '2':
  +			return OutputCharType(XalanUnicode::charDigit_2);
  +			break;
   
  -		theFormatter.precision(20);
  +		case '3':
  +			return OutputCharType(XalanUnicode::charDigit_3);
  +			break;
   
  -		theFormatter << theDouble << '\0';
  -#endif
  -		// OK, now we have to clean up the output for
  -		// the XPath standard, which says no trailing
  -		// '0's for the decimal portion.  So start with
  -		// the last digit, and replace any '0's with the
  -		// null character.  We know at this point that
  -		// we have at least 1 digit before the decimal
  -		// point, and and least 1 non-zero digit after
  -		// the decimal point, since any values with no
  -		// fractional part were printed as integers
  -		XalanDOMCharVectorType		theResult =
  -#if defined(XALAN_NON_ASCII_PLATFORM)
  -				MakeXalanDOMCharVector(theBuffer, true);
  -#else
  -				MakeXalanDOMCharVector(theBuffer, false);
  -#endif
  +		case '4':
  +			return OutputCharType(XalanUnicode::charDigit_4);
  +			break;
   
  -		XalanDOMCharVectorType::iterator	thePosition = theResult.end();
  +		case '5':
  +			return OutputCharType(XalanUnicode::charDigit_5);
  +			break;
   
  -		// Move to the terminating null byte...
  -		--thePosition;
  +		case '6':
  +			return OutputCharType(XalanUnicode::charDigit_6);
  +			break;
   
  -		// Now, move back while there are zeros.
  -		while(*--thePosition == XalanUnicode::charDigit_0)
  -		{
  -		}
  +		case '7':
  +			return OutputCharType(XalanUnicode::charDigit_7);
  +			break;
   
  -		// If there's no fractional part, make sure we get rid
  -		// of the decimal point...
  -		if (fracPart != 0 ||
  -			*thePosition != XalanUnicode::charFullStop)
  -		{
  -			// Move up one, since we need to keep at least one...
  -			++thePosition;
  -		}
  +		case '8':
  +			return OutputCharType(XalanUnicode::charDigit_8);
  +			break;
  +
  +		case '9':
  +			return OutputCharType(XalanUnicode::charDigit_9);
  +			break;
   
  -		// Terminate it...
  -		*thePosition = 0;
  -			
  -		return XalanDOMString(theResult.begin());
  +		default:
  +			return OutputCharType(0);
  +			break;
  +		}
   	}
  +};
  +
  +
  +
  +template<class InputCharType, class OutputCharType>
  +DecimalNumberTranscodeTransform<InputCharType, OutputCharType>
  +makeDecimalNumberTranscodeTransform(
  +			const InputCharType*,
  +			const OutputCharType*)
  +{
  +	return DecimalNumberTranscodeTransform<InputCharType, OutputCharType>();
   }
   
   
   
  -XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(XalanDOMString)
  -LongToHexDOMString(long		theLong)
  +// A very cheap hex number transcoder...
  +template <class InputCharType, class OutputCharType>
  +class HexadecimalDecimalNumberTranscodeTransform : public DecimalNumberTranscodeTransform<InputCharType, OutputCharType>
   {
  -// I'm 99% sure that we don't need to use swprintf
  -// to format, since strings of numbers don't to be
  -// generated as wide strings.
  -#if 0 // defined(XALAN_USE_WCHAR_SUPPORT)
  +public:
   
  -	wchar_t		theBuffer[MAX_PRINTF_DIGITS + 1];
  +	typedef DecimalNumberTranscodeTransform<InputCharType, OutputCharType>	BaseClassType;
   
  -	swprintf(theBuffer,
  -			 L"%lx",
  -			 theLong);
  +	OutputCharType
  +	operator()(InputCharType	theChar) const
  +	{
  +		switch(theChar)
  +		{
  +		case 'A':
  +			return OutputCharType(XalanUnicode::char_A);
  +			break;
   
  -	return XalanDOMString(theBuffer, length(theBuffer));
  +		case 'a':
  +			return OutputCharType(XalanUnicode::char_a);
  +			break;
   
  -#else
  +		case 'B':
  +			return OutputCharType(XalanUnicode::char_B);
  +			break;
  +
  +		case 'b':
  +			return OutputCharType(XalanUnicode::char_b);
  +			break;
   
  -	char		theBuffer[MAX_PRINTF_DIGITS + 1];
  +		case 'C':
  +			return OutputCharType(XalanUnicode::char_C);
  +			break;
   
  -	ostrstream	theFormatter(theBuffer, sizeof(theBuffer));
  +		case 'c':
  +			return OutputCharType(XalanUnicode::char_c);
  +			break;
   
  -	theFormatter << hex << theLong << '\0';
  +		case 'D':
  +			return OutputCharType(XalanUnicode::char_D);
  +			break;
   
  -	// We don't need to transcode, so just make it a
  -	// wide character string...
  -	XalanDOMChar	theResult[MAX_PRINTF_DIGITS + 1];
  +		case 'd':
  +			return OutputCharType(XalanUnicode::char_d);
  +			break;
   
  -	const unsigned int	theLength = strlen(theBuffer);
  +		case 'E':
  +			return OutputCharType(XalanUnicode::char_E);
  +			break;
   
  -#if defined(XALAN_NO_ALGORITHMS_WITH_BUILTINS)
  -	XalanCopy(theBuffer, theBuffer + theLength, theResult);
  -#else
  -	copy(theBuffer, theBuffer + theLength, theResult);
  -#endif
  +		case 'e':
  +			return OutputCharType(XalanUnicode::char_e);
  +			break;
  +
  +		case 'F':
  +			return OutputCharType(XalanUnicode::char_F);
  +			break;
   
  -	return XalanDOMString(theResult, theLength);
  +		case 'f':
  +			return OutputCharType(XalanUnicode::char_f);
  +			break;
  +
  +		default:
  +			return BaseClassType::operator()(theChar);
  +			break;
  +		}
  +	}
  +};
  +
   
  +
  +template <class InputIteratorType, class OutputIteratorType>
  +OutputIteratorType
  +TranscodeNumber(
  +			InputIteratorType	theInputBegin,
  +			InputIteratorType	theInputEnd,
  +			OutputIteratorType	theOutputIterator)
  +{
  +	return TransformString(
  +				theInputBegin,
  +				theInputEnd,
  +				theOutputIterator,
  +#if defined(XALAN_NON_ASCII_PLATFORM)
  +				DecimalNumberTranscodeTransform<char, XalanDOMChar>());
  +#else
  +				IdentityTransform<char, XalanDOMChar>());
   #endif
   }
   
   
   
  -XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(XalanDOMString)
  -UnsignedLongToHexDOMString(unsigned long	theUnsignedLong)
  +XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
  +DoubleToDOMString(
  +			double				theDouble,
  +			XalanDOMString&		theString)
   {
  -	char		theBuffer[MAX_PRINTF_DIGITS + 1];
  +	if (DoubleSupport::isNaN(theDouble) == true)
  +	{
  +		theString = theNaNString;
  +	}
  +	else if (DoubleSupport::isPositiveInfinity(theDouble) == true)
  +	{
  +		theString = thePositiveInfinityString;
  +	}
  +	else if (DoubleSupport::isNegativeInfinity(theDouble) == true)
  +	{
  +		theString = theNegativeInfinityString;
  +	}
  +	else if (DoubleSupport::isNegativeZero(theDouble) == true)
  +	{
  +		theString = theNegativeZeroString;
  +	}
  +	else if (DoubleSupport::isPositiveZero(theDouble) == true)
  +	{
  +		theString = thePositiveZeroString;
  +	}
  +	else
  +	{
  +		char			theBuffer[MAX_PRINTF_DIGITS + 1];
   
  -	ostrstream	theFormatter(theBuffer, sizeof(theBuffer));
  +		unsigned int	theCharsWritten = sprintf(theBuffer, "%f", theDouble);
  +		assert(theCharsWritten != 0);
   
  -	theFormatter << hex << theUnsignedLong << '\0';
  +		// First, cleanup the output to conform to the XPath standard,
  +		// which says no trailing '0's for the decimal portion.
  +		// So start with the last digit, and search until we find
  +		// the last correct character for the output.
  +		// Also, according to the XPath standard, any values without
  +		// a fractional part are printed as integers.  There's always
  +		// a decimal point, so we have to strip stuff away...
   
  -	// We don't need to transcode, so just make it a
  -	// wide character string...
  -	XalanDOMChar	theResult[MAX_PRINTF_DIGITS + 1];
  +		// Now, move back while there are zeros...
  +		while(theBuffer[--theCharsWritten] == '0')
  +		{
  +		}
   
  -	const unsigned int	theLength = strlen(theBuffer);
  +		// If a decimal point stopped the loop, then
  +		// we don't want to preserve it.  Otherwise,
  +		// another digit stopped the loop, so we must
  +		// preserve it.
  +		if(theBuffer[theCharsWritten] != '.')
  +		{
  +			++theCharsWritten;
  +		}
   
  -#if defined(XALAN_NO_ALGORITHMS_WITH_BUILTINS)
  -	XalanCopy(theBuffer, theBuffer + theLength, theResult);
  +#if defined(XALAN_USE_XERCES_DOMSTRING)
  +		XalanDOMChar	theResult[sizeof(theBuffer)];
  +
  +		TranscodeNumber(
  +				theBuffer,
  +				theBuffer + theCharsWritten,
  +				theResult);
  +
  +		theString = XalanDOMString(theResult, theCharsWritten);
   #else
  -	copy(theBuffer, theBuffer + theLength, theResult);
  -#endif
  +		reserve(theString, theCharsWritten);
   
  -	return XalanDOMString(theResult, theLength);
  +		TranscodeNumber(
  +				theBuffer,
  +				theBuffer + theCharsWritten,
  +				back_inserter(theString));
  +#endif
  +	}
   }
   
   
   
  -XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(XalanDOMString)
  -LongToDOMString(long	theLong)
  +template <class ScalarType>
  +XalanDOMChar*
  +ScalarToDecimalString(
  +			ScalarType		theValue,
  +			XalanDOMChar*	theOutput)
   {
  -#if 0 // defined(XALAN_USE_WCHAR_SUPPORT)
  +	// Null terminate it...
  +	*theOutput = 0;
   
  -	wchar_t		theBuffer[MAX_PRINTF_DIGITS + 1];
  +	if (theValue < 0)
  +	{
  +		do
  +		{
  +			*--theOutput = XalanDOMChar(-(theValue % 10) + XalanUnicode::charDigit_0);
   
  -	swprintf(theBuffer,
  -			 L"%ld",
  -			 theLong);
  +			// OK, we're done with it...
  +			theValue /= 10;
  +		}
  +		while(theValue != 0);
   
  -	return XalanDOMString(theBuffer, length(theBuffer));
  +		*--theOutput = XalanUnicode::charHyphenMinus;
  +	}
  +	else
  +	{
  +		do
  +		{
  +			*--theOutput = XalanDOMChar(theValue % 10 + XalanUnicode::charDigit_0);
   
  -#else
  +			// OK, we're done with it...
  +			theValue /= 10;
  +		}
  +		while(theValue != 0);
  +	}
   
  -	char		theBuffer[MAX_PRINTF_DIGITS + 1];
  +	return theOutput;
  +}
   
  -	ostrstream	theFormatter(theBuffer, sizeof(theBuffer));
   
  -	theFormatter << theLong << '\0';
   
  +template <class ScalarType>
  +void
  +ScalarToDecimalString(
  +			ScalarType			theValue,
  +			XalanDOMString&		theResult)
  +{
   	// We don't need to transcode, so just make it a
   	// wide character string...
  -	XalanDOMChar	theResult[MAX_PRINTF_DIGITS + 1];
  +	XalanDOMChar			theBuffer[MAX_PRINTF_DIGITS + 1];
   
  -	const unsigned int	theLength = strlen(theBuffer);
  +	XalanDOMChar* const		theEnd = &theBuffer[MAX_PRINTF_DIGITS];
   
  -#if defined(XALAN_NO_ALGORITHMS_WITH_BUILTINS)
  -	XalanCopy(theBuffer, theBuffer + theLength, theResult);
  -#else
  -	copy(theBuffer, theBuffer + theLength, theResult);
  -#endif
  +	XalanDOMChar* const		theBegin = ScalarToDecimalString(theValue, theEnd);
   
  -	return XalanDOMString(theResult, theLength);
  -#endif
  +	append(theResult, theBegin, theEnd - theBegin);
   }
   
   
   
  -XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
  -UnsignedLongToDOMString(
  -			unsigned long		theValue,
  -			XalanDOMString&		theResult)
  +template <class ScalarType>
  +XalanDOMChar*
  +UnsignedScalarToHexadecimalString(
  +			ScalarType		theValue,
  +			XalanDOMChar*	theOutput)
   {
  -#if 1
  +	if (theValue >= 0)
  +	{
  +		// Null terminate it...
  +		*theOutput = 0;
   
  -	XalanDOMChar				theBuffer[MAX_PRINTF_DIGITS + 1];
  +		do
  +		{
  +			// Next spot...
  +			--theOutput;
   
  -	XalanDOMChar*				thePointer = &theBuffer[MAX_PRINTF_DIGITS];
  -	const XalanDOMChar* const	theEnd = thePointer;
  +			const ScalarType	theTemp = theValue % 16;
   
  -	// Null terminate it...
  -	*thePointer = 0;
  +			// Isolate the left most character.
  +			if (theTemp >= 0 && theTemp <= 9)
  +			{
  +				*theOutput = XalanDOMChar(theTemp + XalanUnicode::charDigit_0);
  +			}
  +			else
  +			{
  +				assert(theTemp >= 10 && theTemp <= 15);
  +
  +				*theOutput = XalanDOMChar(theTemp - 10 + XalanUnicode::charLetter_A);
  +			}
  +
  +			// OK, we're done with it...
  +			theValue /= 16;
  +		}
  +		while(theValue != 0);
  +	}
   
  -	do
  +	return theOutput;
  +}
  +
  +
  +
  +template <class ScalarType>
  +void
  +UnsignedScalarToHexadecimalString(
  +			ScalarType			theValue,
  +			XalanDOMString&		theResult)
  +{
  +	if (theValue >= 0)
   	{
  -		// Next spot...
  -		--thePointer;
  +		// We don't need to transcode, so just make it a
  +		// wide character string...
  +		XalanDOMChar			theBuffer[MAX_PRINTF_DIGITS + 1];
   
  -		// Isolate the left most character.
  -		*thePointer = XalanDOMChar(theValue % 10 + XalanUnicode::charDigit_0);
  +		XalanDOMChar* const		theEnd = &theBuffer[MAX_PRINTF_DIGITS];
   
  -		// OK, we're done with it...
  -		theValue /= 10;
  +		XalanDOMChar* const		theBegin = UnsignedScalarToHexadecimalString(theValue, theEnd);
  +
  +		append(theResult, theBegin, theEnd - theBegin);
   	}
  -	while(theValue != 0);
  +}
   
  -	assign(theResult, thePointer, theEnd - thePointer);
   
  -#elif defined(XALAN_USE_WCHAR_SUPPORT)
   
  -	wchar_t		theBuffer[MAX_PRINTF_DIGITS + 1];
  +XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
  +LongToHexDOMString(
  +			long				theValue,
  +			XalanDOMString&		theResult)
  +{
  +	UnsignedScalarToHexadecimalString(theValue, theResult);
  +}
   
  -	swprintf(theBuffer,
  -			 L"%lu",
  -			 theValue);
   
  -	assign(theResult, theBuffer, length(theBuffer));
   
  -#else
  -
  -	char		theBuffer[MAX_PRINTF_DIGITS + 1];
  +XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
  +UnsignedLongToHexDOMString(
  +			unsigned long		theValue,
  +			XalanDOMString&		theResult)
  +{
  +	UnsignedScalarToHexadecimalString(theValue, theResult);
  +}
   
  -	ostrstream	theFormatter(theBuffer, sizeof(theBuffer));
   
  -	theFormatter << theValue << '\0';
   
  -	XalanDOMChar	theWideBuffer[MAX_PRINTF_DIGITS + 1];
  +XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
  +LongToDOMString(
  +			long				theValue,
  +			XalanDOMString&		theResult)
  +{
  +	ScalarToDecimalString(theValue, theResult);
  +}
   
  -	const unsigned int	theLength = length(theBuffer);
   
  -#if defined(XALAN_NO_ALGORITHMS_WITH_BUILTINS)
  -	XalanCopy(theBuffer, theBuffer + theLength, theWideBuffer);
  -#else
  -	copy(theBuffer, theBuffer + theLength, theWideBuffer);
  -#endif
   
  -	assign(theResult, theWideBuffer, theLength);
  -#endif
  +XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
  +UnsignedLongToDOMString(
  +			unsigned long		theValue,
  +			XalanDOMString&		theResult)
  +{
  +	ScalarToDecimalString(theValue, theResult);
   }
   
   
  
  
  
  1.38      +112 -105  xml-xalan/c/src/PlatformSupport/DOMStringHelper.hpp
  
  Index: DOMStringHelper.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/DOMStringHelper.hpp,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- DOMStringHelper.hpp	2000/11/29 18:29:41	1.37
  +++ DOMStringHelper.hpp	2000/12/01 22:13:21	1.38
  @@ -124,8 +124,6 @@
   	return XalanDOMString(theString);
   }
   
  -
  -
   #else
   
   #define XALAN_STATIC_UCODE_STRING(str) TranscodeFromLocalCodePage(str)
  @@ -144,8 +142,6 @@
   	return theString;
   }
   
  -
  -
   #endif
   
   
  @@ -335,24 +331,6 @@
   			const XalanDOMChar*		theString,
   			XalanDOMChar			theChar)
   {
  -	// For the time being, we're using our own custom routine,
  -	// since performance is better.
  -#if 0 // defined(XALAN_USE_WCHAR_SUPPORT)
  -
  -	const XalanDOMChar* const	thePointer =
  -			wcschr(theString, theChar);
  -
  -	if (thePointer == 0)
  -	{
  -		return length(theString);
  -	}
  -	else
  -	{
  -		return thePointer - theString;
  -	}
  -
  -#else
  -
   	const XalanDOMChar*		thePointer = theString;
   
   	while(*thePointer != theChar && *thePointer != 0)
  @@ -361,8 +339,6 @@
   	}
   
   	return thePointer - theString;
  -
  -#endif
   }
   
   
  @@ -434,37 +410,13 @@
    * found.
    */
   
  -// For the time being, we're using our own custom routine,
  -// since performance is better.
  -#if 0 // defined(XALAN_USE_WCHAR_SUPPORT)
  -
  -inline unsigned int
  -lastIndexOf(
  -			const XalanDOMChar*		theString,
  -			XalanDOMChar			theChar)
  -{
  -	const XalanDOMChar* const	thePointer =
  -			wcsrchr(theString, theChar);
  -
  -	if (thePointer == 0)
  -	{
  -		return length(theString);
  -	}
  -	else
  -	{
  -		return thePointer - theString;
  -	}
  -}
  -
  -#else
  -
   XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(unsigned int)
   lastIndexOf(
   			const XalanDOMChar*		theString,
   			XalanDOMChar			theChar);
   
  -#endif
   
  +
   /**
    * Simulates the java String method lastIndexOf().
    * 
  @@ -562,6 +514,7 @@
   }
   
   
  +
   /**
    * Simulates the java String method endsWith().
    * 
  @@ -596,52 +549,137 @@
   /**
    * Converts a double value into a XalanDOMString
    * 
  - * @param theDouble number to be converted
  + * @param theValue number to be converted
  + * @param theResult the string to append with the result
  + */
  +XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
  +DoubleToDOMString(
  +			double				theValue,
  +			XalanDOMString&		theResult);
  +
  +
  +
  +/**
  + * Converts a double value into a XalanDOMString
  + * 
  + * @param theValue number to be converted
    * @return decimal string representation of the number
    */
  -XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(XalanDOMString)
  -DoubleToDOMString(double	theDouble);
  +inline const XalanDOMString
  +DoubleToDOMString(double	theValue)
  +{
  +	XalanDOMString	theResult;
  +
  +	DoubleToDOMString(theValue, theResult);
   
  +	return theResult;
  +}
   
   
  +
   /**
  - * Converts a long value into a XalanDOMString
  + * Converts a long value into a XalanDOMString.  Negative
  + * values are ignored.
    * 
  - * @param theInt number to be converted
  + * @param theValue number to be converted
  + * @param theResult the string to append with the result
  + */
  +XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
  +LongToHexDOMString(
  +			long				theValue,
  +			XalanDOMString&		theResult);
  +
  +
  +
  +/**
  + * Converts a long value into a XalanDOMString.  Returns
  + * an empty string for negative values.
  + * 
  + * @param theValue number to be converted
    * @return hexadecimal string representation of the number
    */
  -XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(XalanDOMString)
  -LongToHexDOMString(long		theLong);
  +inline const XalanDOMString
  +LongToHexDOMString(long		theValue)
  +{
  +	XalanDOMString	theResult;
   
  +	LongToHexDOMString(theValue, theResult);
   
  +	return theResult;
  +}
  +
  +
   
   /**
  - * Converts an unsigned long value into a XalanDOMString
  + * Converts an unsigned long value  and appends the
  + * result to a XalanDOMString.
    * 
  - * @param theUnsignedLong number to be converted
  + * @param theValue number to be converted
  + * @param theResult the string to append with the result
  + */
  +XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
  +UnsignedLongToHexDOMString(
  +			unsigned long		theValue,
  +			XalanDOMString&		theResult);
  +
  +
  +
  +/**
  + * Converts an unsigned long value and appends the
  + * result to a XalanDOMString.
  + *
  + * @param theValue number to be converted
    * @return hexadecimal string representation of the number
    */
  -XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(XalanDOMString)
  -UnsignedLongToHexDOMString(unsigned long	theValue);
  +inline const XalanDOMString
  +UnsignedLongToHexDOMString(unsigned long	theValue)
  +{
  +	XalanDOMString	theResult;
  +
  +	UnsignedLongToHexDOMString(theValue, theResult);
  +
  +	return theResult;
  +}
   
   
   
   /**
    * Converts a long value into a XalanDOMString
    * 
  - * @param theInt number to be converted
  + * @param theValue number to be converted
  + * @param theResult the string to append with the result
  + */
  +XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
  +LongToDOMString(
  +			long				theValue,
  +			XalanDOMString&		theResult);
  +
  +
  +
  +/**
  + * Converts a long value into a XalanDOMString
  + * 
  + * @param theValue number to be converted
    * @return decimal string representation of the number
    */
  -XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(XalanDOMString)
  -LongToDOMString(long	theValue);
  +inline const XalanDOMString
  +LongToDOMString(long	theValue)
  +{
  +	XalanDOMString	theResult;
   
  +	LongToDOMString(theValue, theResult);
   
  +	return theResult;
  +}
   
  +
  +
   /**
  - * Converts an unsigned long value into a XalanDOMString
  + * Converts an unsigned long value and appends the
  + * result to a XalanDOMString.
    * 
    * @param theValue number to be converted
  - * @param theString The string for the result.
  + * @param theResult the string to append with the result
    */
   XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
   UnsignedLongToDOMString(
  @@ -653,7 +691,7 @@
   /**
    * Converts an unsigned long value into a XalanDOMString
    * 
  - * @param theInt number to be converted
  + * @param theValue number to be converted
    * @return decimal string representation of the number
    */
   inline const XalanDOMString
  @@ -1057,7 +1095,7 @@
   inline bool
   isXMLWhitespace(XalanDOMChar	theChar)
   {
  -	return XalanXMLChar::isWhitespace(theChar) ? true : false;
  +	return XalanXMLChar::isWhitespace(theChar);
   }
   
   
  @@ -1069,9 +1107,9 @@
    * @return true if character represents a digit
    */
   inline bool
  -isXMLDigit(XalanDOMChar	theChar)
  +isXMLDigit(XalanDOMChar		theChar)
   {	
  -	return XalanXMLChar::isDigit(theChar) ? true : false;
  +	return XalanXMLChar::isDigit(theChar);
   }
   
   
  @@ -1083,10 +1121,10 @@
    * @return true if character represents a letter or digit
    */
   inline bool
  -isXMLLetterOrDigit(XalanDOMChar	theChar)
  +isXMLLetterOrDigit(XalanDOMChar		theChar)
   {
   	return	XalanXMLChar::isDigit(theChar) || 
  -			XalanXMLChar::isLetter(theChar) ? true : false;
  +			XalanXMLChar::isLetter(theChar);
   }
   
   
  @@ -1106,7 +1144,7 @@
   substring(
   			const XalanDOMChar*		theString,
   			unsigned int			theStartIndex,
  -			unsigned int			theEndIndex = UINT_MAX);
  +			unsigned int			theEndIndex = unsigned(-1));
   
   
   
  @@ -1125,7 +1163,7 @@
   substring(
   			const XalanDOMString&	theString,
   			unsigned int			theStartIndex,
  -			unsigned int			theEndIndex = UINT_MAX);
  +			unsigned int			theEndIndex = unsigned(-1));
   
   
   
  @@ -1313,11 +1351,6 @@
   
   
   
  -// For the time being, we're using our own custom routine,
  -// since performance is better.
  -
  -#if 0 // defined(XALAN_USE_WCHAR_SUPPORT)
  -
   /**
    * Compare the contents of two strings.
    * 
  @@ -1326,23 +1359,11 @@
    * @return Returns 0 for equal strings, less than 0 if theLHS is less
    * than theRHS, or greater than 0 if theRHS is greater than theLHS.
    */
  -inline int
  -compare(
  -			const XalanDOMChar*		theLHS,
  -			const XalanDOMChar*		theRHS)
  -{
  -	return wcscmp(theLHS, theRHS);
  -}
  -
  -#else
  -
   XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(int)
   compare(
   			const XalanDOMChar*		theLHS,
   			const XalanDOMChar*		theRHS);
   
  -#endif
  -
   
   
   /**
  @@ -1444,8 +1465,6 @@
   
   
   
  -#if 0 // defined(XALAN_USE_WCHAR_SUPPORT)
  -
   /**
    * Compare the contents of two strings using the
    * the collation settings of the current code page.
  @@ -1457,16 +1476,6 @@
    * @see operator<()
    * @see compare()
    */
  -inline int
  -collationCompare(
  -			const XalanDOMChar*		theLHS,
  -			const XalanDOMChar*		theRHS)
  -{
  -	return wcscoll(theLHS, theRHS);
  -}
  -
  -#else
  -
   // Can't really do it, so just call compare...
   inline int
   collationCompare(
  @@ -1476,8 +1485,6 @@
   	return compare(theLHS, theRHS);
   }
   
  -#endif
  -
   
   
   /**
  @@ -2029,7 +2036,7 @@
   
   		theTemp.push_back(char(0));
   
  -		append(theString, XalanDOMString(&theTemp[0]));
  +		append(theString, XalanDOMString(&theTemp[0], theTemp.size() - 1));
   	}
   #endif