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/09/27 18:24:38 UTC

cvs commit: xml-xalan/c/src/PlatformSupport XalanFileOutputStream.cpp XalanFileOutputStream.hpp XalanNullOutputStream.cpp XalanNullOutputStream.hpp XalanOutputStream.cpp XalanOutputStream.hpp XalanOutputStreamPrintWriter.cpp XalanOutputStreamPrintWriter.hpp XalanStdOutputStream.cpp XalanStdOutputStream.hpp XalanToXercesTranscoderWrapper.cpp XalanToXercesTranscoderWrapper.hpp XalanTranscodingServices.cpp XalanTranscodingServices.hpp XalanUTF16Transcoder.cpp XalanUTF16Transcoder.hpp DOMStringHelper.cpp DOMStringHelper.hpp DoubleSupport.cpp DoubleSupport.hpp PlatformSupportInit.cpp URISupport.cpp Writer.cpp Writer.hpp TextOutputStream.cpp TextOutputStream.hpp

dbertoni    00/09/27 09:24:32

  Modified:    c/src/PlatformSupport DOMStringHelper.cpp
                        DOMStringHelper.hpp DoubleSupport.cpp
                        DoubleSupport.hpp PlatformSupportInit.cpp
                        URISupport.cpp Writer.cpp Writer.hpp
  Added:       c/src/PlatformSupport XalanFileOutputStream.cpp
                        XalanFileOutputStream.hpp XalanNullOutputStream.cpp
                        XalanNullOutputStream.hpp XalanOutputStream.cpp
                        XalanOutputStream.hpp
                        XalanOutputStreamPrintWriter.cpp
                        XalanOutputStreamPrintWriter.hpp
                        XalanStdOutputStream.cpp XalanStdOutputStream.hpp
                        XalanToXercesTranscoderWrapper.cpp
                        XalanToXercesTranscoderWrapper.hpp
                        XalanTranscodingServices.cpp
                        XalanTranscodingServices.hpp
                        XalanUTF16Transcoder.cpp XalanUTF16Transcoder.hpp
  Removed:     c/src/PlatformSupport TextOutputStream.cpp
                        TextOutputStream.hpp
  Log:
  Output transcoding support.
  
  Revision  Changes    Path
  1.35      +176 -30   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.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- DOMStringHelper.cpp	2000/09/20 18:19:22	1.34
  +++ DOMStringHelper.cpp	2000/09/27 16:23:35	1.35
  @@ -98,7 +98,7 @@
   
   #include "DoubleSupport.hpp"
   #include "STLHelper.hpp"
  -#include "TextOutputStream.hpp"
  +#include "XalanOutputStream.hpp"
   #include "XalanAutoPtr.hpp"
   #include "XalanUnicode.hpp"
   
  @@ -406,7 +406,7 @@
   
   
   XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
  -OutputString(TextOutputStream&		theStream,
  +OutputString(XalanOutputStream&		theStream,
   			 const CharVectorType&	theString)
   {
   	if (theString.size() > 0)
  @@ -435,7 +435,7 @@
   
   
   XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
  -OutputString(TextOutputStream&		theStream,
  +OutputString(XalanOutputStream&		theStream,
   			 const XalanDOMChar*	theString)
   {
   	if (theString != 0)
  @@ -757,13 +757,13 @@
   
   
   
  -template <class Type>
  +template <class Type, class SizeType>
   int
   doCompare(
   			const Type*		theLHS,
  -			unsigned int	theLHSLength,
  +			SizeType		theLHSLength,
   			const Type*		theRHS,
  -			unsigned int	theRHSLength)
  +			SizeType		theRHSLength)
   {
   	int					theResult = 0;
   
  @@ -772,7 +772,7 @@
   		Type		theLHSChar = Type(0);
   		Type		theRHSChar = Type(0);
   
  -		unsigned int	i = 0;
  +		SizeType	i = 0;
   
   		for(; i < theLHSLength && i < theRHSLength; i++)
   		{
  @@ -1550,9 +1550,11 @@
   
   
   
  -XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(bool)
  -TranscodeToLocalCodePage(
  +static bool
  +doTranscodeToLocalCodePage(
   			const XalanDOMChar*		sourceString,
  +			unsigned int			sourceStringLength,
  +			bool					sourceStringIsNullTerminated,
   			CharVectorType&			targetVector,
   			bool					terminate)
   {
  @@ -1562,49 +1564,120 @@
   		if (terminate == true)
   		{
   			targetVector.resize(1);
  +
  +			targetVector.back() = '\0';
   		}
   		else
   		{
  -			targetVector.resize(1);
  +			targetVector.resize(0);
   		}
   
           return true;
   	}
   
  -	const unsigned int			len = length(sourceString);
  +	const XalanDOMChar*		tempSource = 0;
   
  +	// If our char sizes are not the same, we have to use a temp buffer.
   	XalanArrayAutoPtr<wchar_t>	tempSourceJanitor;
   
  -	const XalanDOMChar*			tempSource = sourceString;
  +#if !defined(XALAN_XALANDOMCHAR_USHORT_MISMATCH)
  +	// This is a short-cut for when the sourceString is mull-terminated _and_
  +	// XalanDOMChar and wchar_t are the same thing.
  +	if (sourceStringIsNullTerminated == true)
  +	{
  +		tempSource = sourceString;
  +	}
  +	else
  +#endif
  +	{
  +		if (sourceStringIsNullTerminated == true)
  +		{
  +			sourceStringLength = length(sourceString);
  +		}
   
  -    // See if our XalanDOMChar and wchar_t as the same on this platform
  -    if (sizeof(XalanDOMChar) != sizeof(wchar_t))
  -    {
  -		//
  -		//  If either the passed length was non-zero or our char sizes are not 
  -		//  same, we have to use a temp buffer.
  -		//
  -		tempSourceJanitor.reset(new wchar_t[len + 1]);
  +		tempSourceJanitor.reset(new wchar_t[sourceStringLength + 1]);
   
  -        for (unsigned int index = 0; index < len; index++)
  +		for (unsigned int index = 0; index < sourceStringLength; ++index)
   		{
  -            tempSourceJanitor[index] = wchar_t(sourceString[index]);
  +			tempSourceJanitor[index] = wchar_t(sourceString[index]);
   		}
   
  -		tempSourceJanitor[len] = 0;
  +		tempSourceJanitor[sourceStringLength] = 0;
   
   		tempSource = tempSourceJanitor.get();
  -    }
  +	}
   
  -    // See now many chars we need to transcode this guy
  +    // See now many chars we need to transcode.
       const unsigned int targetLen = ::wcstombs(0, tempSource, 0);
   
  -	targetVector.resize(targetLen);
  +	// Resize, adding one byte if terminating...
  +	targetVector.resize(terminate == true ? targetLen + 1 : targetLen);
   
  +    //  And transcode our temp source buffer to the local buffer. Terminate
       //
  -    //  And transcode our temp source buffer to the local buffer. Cap it
  -    //  off since the converter won't do it (because the null is beyond
  -    //  where the target will fill up.)
  +    if (wcstombs(&targetVector[0], tempSource, targetLen) == size_t(-1))
  +	{
  +		return false;
  +	}
  +	else
  +	{
  +		if (terminate == true)
  +		{
  +			targetVector.back() = '\0';
  +		}
  +
  +		return true;
  +	}
  +}
  +
  +
  +
  +XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(bool)
  +TranscodeToLocalCodePage(
  +			const XalanDOMChar*		sourceString,
  +			unsigned int			sourceStringLength,
  +			CharVectorType&			targetVector,
  +			bool					terminate)
  +{
  +#if 1
  +	return doTranscodeToLocalCodePage(sourceString, sourceStringLength, false, targetVector, terminate);
  +#else
  +    // Short circuit if it's a null pointer, or of length 0.
  +    if (!sourceString || (!sourceString[0]))
  +    {
  +		if (terminate == true)
  +		{
  +			targetVector.resize(1);
  +
  +			targetVector.back() = '\0';
  +		}
  +		else
  +		{
  +			targetVector.resize(0);
  +		}
  +
  +        return true;
  +	}
  +
  +	// If our char sizes are not the same, we have to use a temp buffer.
  +	XalanArrayAutoPtr<wchar_t>	tempSourceJanitor(new wchar_t[sourceStringLength + 1]);
  +
  +	for (unsigned int index = 0; index < sourceStringLength; ++index)
  +	{
  +		tempSourceJanitor[index] = wchar_t(sourceString[index]);
  +	}
  +
  +	tempSourceJanitor[sourceStringLength] = 0;
  +
  +	const XalanDOMChar*	const	tempSource = tempSourceJanitor.get();
  +
  +    // See now many chars we need to transcode.
  +    const unsigned int targetLen = ::wcstombs(0, tempSource, 0);
  +
  +	// Resize, adding one byte if terminating...
  +	targetVector.resize(terminate == true ? targetLen + 1 : targetLen);
  +
  +    //  And transcode our temp source buffer to the local buffer. Terminate
       //
       if (wcstombs(&targetVector[0], tempSource, targetLen) == size_t(-1))
   	{
  @@ -1614,9 +1687,82 @@
   	{
   		if (terminate == true)
   		{
  -			targetVector.resize(targetVector.size() + 1);
  +			targetVector.back() = '\0';
   		}
   
   		return true;
   	}
  +#endif
  +}
  +
  +
  +
  +XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(bool)
  +TranscodeToLocalCodePage(
  +			const XalanDOMChar*		sourceString,
  +			CharVectorType&			targetVector,
  +			bool					terminate)
  +{
  +#if 1
  +	return doTranscodeToLocalCodePage(sourceString, 0, true, targetVector, terminate);
  +#else
  +    // Short circuit if it's a null pointer, or of length 0.
  +    if (!sourceString || (!sourceString[0]))
  +    {
  +		if (terminate == true)
  +		{
  +			targetVector.resize(1);
  +
  +			targetVector.back() = '\0';
  +		}
  +		else
  +		{
  +			targetVector.resize(0);
  +		}
  +
  +        return true;
  +	}
  +
  +#if !defined(XALAN_XALANDOMCHAR_USHORT_MISMATCH)
  +	const XalanDOMChar*	const	tempSource = sourceString;
  +#else
  +    assert(sizeof(XalanDOMChar) != sizeof(wchar_t));
  +
  +	const unsigned int			len = length(sourceString);
  +
  +	// If our char sizes are not the same, we have to use a temp buffer.
  +	XalanArrayAutoPtr<wchar_t>	tempSourceJanitor(new wchar_t[len + 1]);
  +
  +	for (unsigned int index = 0; index < len; ++index)
  +	{
  +		tempSourceJanitor[index] = wchar_t(sourceString[index]);
  +	}
  +
  +	tempSourceJanitor[len] = 0;
  +
  +	const XalanDOMChar*	const	tempSource = tempSourceJanitor.get();
  +#endif
  +
  +    // See now many chars we need to transcode.
  +    const unsigned int targetLen = ::wcstombs(0, tempSource, 0);
  +
  +	// Resize, adding one byte if terminating...
  +	targetVector.resize(terminate == true ? targetLen + 1 : targetLen);
  +
  +    //  And transcode our temp source buffer to the local buffer. Terminate
  +    //
  +    if (wcstombs(&targetVector[0], tempSource, targetLen) == size_t(-1))
  +	{
  +		return false;
  +	}
  +	else
  +	{
  +		if (terminate == true)
  +		{
  +			targetVector.back() = '\0';
  +		}
  +
  +		return true;
  +	}
  +#endif
   }
  
  
  
  1.30      +35 -14    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.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- DOMStringHelper.hpp	2000/09/19 14:43:23	1.29
  +++ DOMStringHelper.hpp	2000/09/27 16:23:55	1.30
  @@ -92,7 +92,7 @@
   
   
   
  -class TextOutputStream;
  +class XalanOutputStream;
   
   
   
  @@ -704,7 +704,7 @@
    */
   XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
   OutputString(
  -			TextOutputStream&		theStream,
  +			XalanOutputStream&		theStream,
   			const CharVectorType&	theString);
   
   
  @@ -736,7 +736,7 @@
    */
   XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(void)
   OutputString(
  -			TextOutputStream&		theStream,
  +			XalanOutputStream&		theStream,
   			const XalanDOMChar*		theString);
   
   
  @@ -768,7 +768,7 @@
    */
   inline void
   OutputString(
  -			TextOutputStream&		theStream,
  +			XalanOutputStream&		theStream,
   			const XalanDOMString&	theString)
   {
   	if (isEmpty(theString) == false)
  @@ -807,9 +807,9 @@
    * @param theString the string to output
    * @see OutputString
    */
  -inline TextOutputStream&
  +inline XalanOutputStream&
   operator<<(
  -			TextOutputStream&		theStream,
  +			XalanOutputStream&		theStream,
   			const CharVectorType&	theString)
   {
   	OutputString(theStream, theString);
  @@ -851,9 +851,9 @@
    * @param theString target string
    * @see OutputString
    */
  -inline TextOutputStream&
  +inline XalanOutputStream&
   operator<<(
  -			TextOutputStream&		theStream,
  +			XalanOutputStream&		theStream,
   			const XalanDOMChar*		theString)
   {
   	OutputString(theStream,
  @@ -897,9 +897,9 @@
    * @param theString target string
    * @see OutputString
    */
  -inline TextOutputStream&
  +inline XalanOutputStream&
   operator<<(
  -			TextOutputStream&		theStream,
  +			XalanOutputStream&		theStream,
   			const XalanDOMString&	theString)
   {
   	OutputString(theStream,
  @@ -1963,11 +1963,12 @@
   
   
   /**
  - * Convert XalanDOMString to C++ standard library
  + * Convert a XalanDOMChar string to C++ standard library
    * vector, transcoding to the default local code
    * page.
    * 
    * @param sourceString The source string
  + * @param sourceStringLength The source string length.
    * @param targetVector The target string
    * @param terminate If true, the transcoded string will be null-terminated
    * @return true if successful, false if not.
  @@ -1975,12 +1976,31 @@
   XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(bool)
   TranscodeToLocalCodePage(
   			const XalanDOMChar*		sourceString,
  +			unsigned int			sourceStringLength,
   			CharVectorType&			targetVector,
   			bool					terminate = false);
   
   
   
   /**
  + * Convert a XalanDOMChar string to C++ standard library
  + * vector, transcoding to the default local code
  + * page.  The string _must_ be null-terminated.
  + * 
  + * @param sourceString The source string
  + * @param targetVector The target string
  + * @param terminate If true, the transcoded string will be null-terminated
  + * @return true if successful, false if not.
  + */
  +XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(bool)
  +TranscodeToLocalCodePage(
  +			const XalanDOMChar*		sourceString,
  +			CharVectorType&			targetVector,
  +			bool					terminate = false);
  +
  +
  +
  +/**
    * Convert XalanDOMString to C++ standard library
    * vector, transcoding to the default local code
    * page.  Null-terminate the sttring...
  @@ -2012,9 +2032,10 @@
   inline bool
   TranscodeToLocalCodePage(
   			const XalanDOMString&	sourceString,
  -			CharVectorType&			targetVector)
  +			CharVectorType&			targetVector,
  +			bool					terminate = false)
   {
  -	return TranscodeToLocalCodePage(c_wstr(sourceString), targetVector);
  +	return TranscodeToLocalCodePage(c_wstr(sourceString), targetVector, terminate);
   }
   
   
  @@ -2032,7 +2053,7 @@
   {
   	CharVectorType	theResult;
   
  -	TranscodeToLocalCodePage(sourceString, theResult);
  +	TranscodeToLocalCodePage(sourceString, theResult, true);
   
   	return theResult;
   }
  
  
  
  1.13      +38 -58    xml-xalan/c/src/PlatformSupport/DoubleSupport.cpp
  
  Index: DoubleSupport.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/DoubleSupport.cpp,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- DoubleSupport.cpp	2000/09/19 14:43:24	1.12
  +++ DoubleSupport.cpp	2000/09/27 16:23:57	1.13
  @@ -57,61 +57,22 @@
   #include "DoubleSupport.hpp"
   
   
  -#if defined(NO_STD_LIMITS)
  -#	if defined(__GNUC__)
  -#		include <math.h>
  -#		if defined(SOLARIS)
  -#			include <nan.h>
  -#		else
  -#			include <bits/nan.h>
  -#		endif
  -#	else
  -#		error Unsupported platform!!!
  -#	endif
  -#else
  -#	include <limits>
  -#endif
   
  +#include <cmath>
   
   
  +
   #include "DOMStringHelper.hpp"
   #include "XalanUnicode.hpp"
   
   
  -
  -#if defined(NO_STD_LIMITS)
  -#	if defined(__GNUC__)
  -
  -#		if defined(SOLARIS)
  -			static const unsigned char	__nan_bits[] = { 0x7f, 0xf0,0xc0,0x0,0x0,0x0,0x0,0x0 };
  -			const double				DoubleSupport::s_NaN = *reinterpret_cast<const double*>(__nan_bits);
  -#		else
  -			const double	DoubleSupport::s_NaN = NAN;
  -#		endif
  -
  -		const double	DoubleSupport::s_positiveInfinity = HUGE_VAL;
  -		const double	DoubleSupport::s_negativeInfinity = -HUGE_VAL;
  -
  -#	else
  -#		error Unsupported platform!!!
  -#	endif
  -#else
  -
  -#if defined(XALAN_NO_NAMESPACES)
  -typedef numeric_limits<double>			NumericLimitsType;
  -#else
  -typedef std::numeric_limits<double>		NumericLimitsType;
  -#endif
  -
  -const double	DoubleSupport::s_NaN = NumericLimitsType::quiet_NaN();
  -const double	DoubleSupport::s_positiveInfinity = NumericLimitsType::infinity();
  -const double	DoubleSupport::s_negativeInfinity = NumericLimitsType::signaling_NaN();
   
  -#endif
  +const double	DoubleSupport::s_NaN = sqrt(-2);
  +const double	DoubleSupport::s_positiveInfinity = HUGE_VAL;
  +const double	DoubleSupport::s_negativeInfinity = -DoubleSupport::s_positiveInfinity;
   
   
   
  -#if defined(XALAN_NEED_SPECIAL_NAN_SUPPORT)
   const unsigned long*	DoubleSupport::s_NaNFirstDWORD =
   #if defined(XALAN_OLD_STYLE_CASTS)
   					(const unsigned long*)&s_NaN;
  @@ -121,7 +82,6 @@
   
   const unsigned long*	DoubleSupport::s_NaNSecondDWORD =
   					s_NaNFirstDWORD + 1;
  -#endif
   
   
   
  @@ -232,10 +192,14 @@
   			double	theLHS,
   			double	theRHS)
   {
  -	if (isNaN(theLHS) == true || isNaN(theRHS) == true)
  +	if (isNaN(theLHS) == true)
   	{
  -		return getNaN();
  +		return theLHS;
   	}
  +	else if (isNaN(theRHS) == true)
  +	{
  +		return theRHS;
  +	}
   	else
   	{
   		return theLHS + theRHS;
  @@ -249,9 +213,13 @@
   			double	theLHS,
   			double	theRHS)
   {
  -	if (isNaN(theLHS) == true || isNaN(theRHS) == true)
  +	if (isNaN(theLHS) == true)
  +	{
  +		return theLHS;
  +	}
  +	else if (isNaN(theRHS) == true)
   	{
  -		return getNaN();
  +		return theRHS;
   	}
   	else
   	{
  @@ -266,9 +234,13 @@
   			double	theLHS,
   			double	theRHS)
   {
  -	if (isNaN(theLHS) == true || isNaN(theRHS) == true)
  +	if (isNaN(theLHS) == true)
  +	{
  +		return theLHS;
  +	}
  +	else if (isNaN(theRHS) == true)
   	{
  -		return getNaN();
  +		return theRHS;
   	}
   	else
   	{
  @@ -283,11 +255,15 @@
   			double	theLHS,
   			double	theRHS)
   {
  -	if (isNaN(theLHS) == true || isNaN(theRHS) == true)
  +	if (isNaN(theLHS) == true)
  +	{
  +		return theLHS;
  +	}
  +	else if (isNaN(theRHS) == true)
   	{
  -		return getNaN();
  +		return theRHS;
   	}
  -	else if (theRHS != 0)
  +	else if (theRHS != 0.0L)
   	{
   		return theLHS / theRHS;
   	}
  @@ -295,12 +271,12 @@
   	{
   		// These are special cases, since we can't actually
   		// do the division...
  -		if (theLHS == 0)
  +		if (theLHS == 0.0L)
   		{
   			// This is NaN...
   			return DoubleSupport::getNaN();
   		}
  -		else if (theLHS > 0.0)
  +		else if (theLHS > 0.0L)
   		{
   			// This is positive infinity...
   			return DoubleSupport::getPositiveInfinity();
  @@ -320,9 +296,13 @@
   			double	theLHS,
   			double	theRHS)
   {
  -	if (isNaN(theLHS) == true || isNaN(theRHS) == true)
  +	if (isNaN(theLHS) == true)
  +	{
  +		return theLHS;
  +	}
  +	else if (isNaN(theRHS) == true)
   	{
  -		return getNaN();
  +		return theRHS;
   	}
   	else
   	{
  
  
  
  1.6       +0 -12     xml-xalan/c/src/PlatformSupport/DoubleSupport.hpp
  
  Index: DoubleSupport.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/DoubleSupport.hpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- DoubleSupport.hpp	2000/07/10 01:04:09	1.5
  +++ DoubleSupport.hpp	2000/09/27 16:23:59	1.6
  @@ -91,9 +91,6 @@
   	static bool
   	isNaN(double	theNumber)
   	{
  -#if !defined(XALAN_NEED_SPECIAL_NAN_SUPPORT)
  -		return theNumber == s_NaN;
  -#else
   		// Compare the two DWORDs of the double as unsigned longs.
   		const unsigned long* const	theFirstDWORD =
   			reinterpret_cast<const unsigned long*>(&theNumber);
  @@ -103,7 +100,6 @@
   
   		return *theFirstDWORD == *s_NaNFirstDWORD &&
   			   *theSecondDWORD == *s_NaNSecondDWORD;
  -#endif
   	}
   
   	/**
  @@ -115,11 +111,7 @@
   	static bool
   	isPositiveInfinity(double	theNumber)
   	{
  -#if !defined(XALAN_NEED_SPECIAL_NAN_SUPPORT)
  -		return theNumber == s_positiveInfinity;
  -#else
   		return !isNaN(theNumber) && theNumber == s_positiveInfinity;
  -#endif
   	}
   
   	/**
  @@ -131,11 +123,7 @@
   	static bool
   	isNegativeInfinity(double	theNumber)
   	{
  -#if !defined(XALAN_NEED_SPECIAL_NAN_SUPPORT)
  -		return theNumber == s_negativeInfinity;
  -#else
   		return !isNaN(theNumber) && theNumber == s_negativeInfinity;
  -#endif
   	}
   
   	// These can be used to initialize values, but should not
  
  
  
  1.3       +5 -0      xml-xalan/c/src/PlatformSupport/PlatformSupportInit.cpp
  
  Index: PlatformSupportInit.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/PlatformSupportInit.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- PlatformSupportInit.cpp	2000/09/05 02:24:45	1.2
  +++ PlatformSupportInit.cpp	2000/09/27 16:24:01	1.3
  @@ -64,6 +64,7 @@
   #include "PrintWriter.hpp"
   #include "URISupport.hpp"
   #include "XalanNumberFormat.hpp"
  +#include "XalanTranscodingServices.hpp"
   
   
   
  @@ -101,6 +102,8 @@
   {
   	DOMStringHelperInitialize();
   
  +	XalanTranscodingServices::initialize();
  +
   	PrintWriter::initialize();
   
   	NamedNodeMapAttributeList::initialize();
  @@ -122,6 +125,8 @@
   	NamedNodeMapAttributeList::terminate();
   
   	PrintWriter::terminate();
  +
  +	XalanTranscodingServices::terminate();
   
   	DOMStringHelperTerminate();
   }
  
  
  
  1.10      +31 -28    xml-xalan/c/src/PlatformSupport/URISupport.cpp
  
  Index: URISupport.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/URISupport.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- URISupport.cpp	2000/09/19 14:43:26	1.9
  +++ URISupport.cpp	2000/09/27 16:24:07	1.10
  @@ -84,7 +84,6 @@
   
   
   
  -
   XalanDOMString
   URISupport::getURLStringFromString(const XalanDOMString&	urlString)
   {
  @@ -92,43 +91,47 @@
   
   	// Let's see what sort of URI we have...
   	const unsigned int	len = length(theNormalizedURI);
  -	const unsigned int	index = indexOf(theNormalizedURI, XalanUnicode::charColon);
  -
  -	bool				protocolPresent = false;
   
  -	if (index != len)
  +	if (len != 0)
   	{
  -		// $$$ ToDo: XMLURL::lookupByName() is supposed to be static, but is not.
  -		const XMLURL::Protocols		theProtocol =
  -			XMLURL().lookupByName(c_wstr(substring(theNormalizedURI, 0 , index)));
  +		const unsigned int	index = indexOf(theNormalizedURI, XalanUnicode::charColon);
  +
  +		bool				protocolPresent = false;
   
  -		if (theProtocol != XMLURL::Unknown)
  +		if (index != len)
   		{
  -			protocolPresent = true;
  +			// $$$ ToDo: XMLURL::lookupByName() is supposed to be static, but is not.
  +			const XMLURL::Protocols		theProtocol =
  +				XMLURL().lookupByName(c_wstr(substring(theNormalizedURI, 0 , index)));
  +
  +			if (theProtocol != XMLURL::Unknown)
  +			{
  +				protocolPresent = true;
  +			}
   		}
  -	}
   
  -	if (protocolPresent == true)
  -	{
  -		NormalizeURIText(theNormalizedURI);
  -	}
  -	else
  -	{
  -		// Assume it's a file specification...
  -		XalanArrayAutoPtr<XMLCh>	theFullPath(XMLPlatformUtils::getFullPath(c_wstr(urlString)));
  -		assert(theFullPath.get() != 0);
  +		if (protocolPresent == true)
  +		{
  +			NormalizeURIText(theNormalizedURI);
  +		}
  +		else
  +		{
  +			// Assume it's a file specification...
  +			XalanArrayAutoPtr<XMLCh>	theFullPath(XMLPlatformUtils::getFullPath(c_wstr(urlString)));
  +			assert(theFullPath.get() != 0);
   
  -		theNormalizedURI = theFullPath.get();
  -		assert(length(theNormalizedURI) > 0);
  +			theNormalizedURI = theFullPath.get();
  +			assert(length(theNormalizedURI) > 0);
   
  -		NormalizeURIText(theNormalizedURI);
  +			NormalizeURIText(theNormalizedURI);
   
  -		const XalanDOMString	theFilePrefix(
  -					indexOf(theNormalizedURI, XalanUnicode::charSolidus) == 0 ?
  -					s_fileProtocolString1 :
  -					s_fileProtocolString2);
  +			const XalanDOMString	theFilePrefix(
  +						indexOf(theNormalizedURI, XalanUnicode::charSolidus) == 0 ?
  +						s_fileProtocolString1 :
  +						s_fileProtocolString2);
   
  -		theNormalizedURI = theFilePrefix + theNormalizedURI;
  +			theNormalizedURI = theFilePrefix + theNormalizedURI;
  +		}
   	}
   
   	return theNormalizedURI;
  
  
  
  1.3       +2 -2      xml-xalan/c/src/PlatformSupport/Writer.cpp
  
  Index: Writer.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/Writer.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Writer.cpp	2000/09/19 14:43:48	1.2
  +++ Writer.cpp	2000/09/27 16:24:08	1.3
  @@ -71,7 +71,7 @@
   
   
   
  -TextOutputStream*
  +XalanOutputStream*
   Writer::getStream()
   {
   	return 0;
  @@ -79,7 +79,7 @@
   
   
   
  -const TextOutputStream*
  +const XalanOutputStream*
   Writer::getStream() const
   {
   	return 0;
  
  
  
  1.10      +3 -3      xml-xalan/c/src/PlatformSupport/Writer.hpp
  
  Index: Writer.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/Writer.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- Writer.hpp	2000/09/19 14:43:49	1.9
  +++ Writer.hpp	2000/09/27 16:24:09	1.10
  @@ -73,7 +73,7 @@
   
   
   
  -class TextOutputStream;
  +class XalanOutputStream;
   
   
   
  @@ -102,13 +102,13 @@
   	/**
   	 * Get the stream associated with the writer...
   	 */
  -	virtual TextOutputStream*
  +	virtual XalanOutputStream*
   	getStream();
   
   	/**
   	 * Get the stream associated with the writer...
   	 */
  -	virtual const TextOutputStream*
  +	virtual const XalanOutputStream*
   	getStream() const;
   
   
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanFileOutputStream.cpp
  
  Index: XalanFileOutputStream.cpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  // Class header file...
  #include "XalanFileOutputStream.hpp"
  
  
  
  #include <cerrno>
  #include <strstream>
  
  
  
  #include <PlatformSupport/DOMStringHelper.hpp>
  #include <PlatformSupport/XalanAutoPtr.hpp>
  
  
  
  
  XalanFileOutputStream::XalanFileOutputStream(const XalanDOMString&		theFileName) :
  	XalanOutputStream(),
  	m_fileName(theFileName),
  	m_handle(0)
  {
  	const XalanArrayAutoPtr<char>	tmpName(theFileName.transcode());
  
  	m_handle = fopen(tmpName.get(), "wb");
  
      if (m_handle == 0)
  	{
  		throw XalanFileOutputStreamOpenException(theFileName,
  												errno);
  	}
  }
  
  
  
  XalanFileOutputStream::~XalanFileOutputStream()
  {
      if (m_handle != 0)
  	{
  		fclose(m_handle);
  	}
  }
  
  
  
  void
  XalanFileOutputStream::doFlush()
  {
  	fflush(m_handle);
  }
  
  
  
  void
  XalanFileOutputStream::writeData(
  			const char*		theBuffer,
  			unsigned long	theBufferLength)
  {
  	const size_t	theBytesWritten =
  		fwrite(theBuffer,
  			   1,
  			   theBufferLength,
  			   m_handle);
  
  	if(theBytesWritten != theBufferLength)
  	{
  		throw XalanFileOutputStreamWriteException(m_fileName,
  												 errno);
  	}
  }
  
  
  
  static XalanDOMString
  FormatMessageLocal(
  			const XalanDOMString&	theMessage,
  			const XalanDOMString&	theFileName,
  			int					theErrorCode)
  {
  	XalanDOMString	theResult(clone(theMessage));
  
  	theResult += theFileName;
  
  #if !defined(XALAN_NO_NAMESPACES)
  using std::ostrstream;
  #endif
  
  	ostrstream	theFormatter;
  
  	theFormatter << ".  The error code was "
  				 << theErrorCode << "." << '\0';
  
  	theResult += theFormatter.str();
  
  	delete theFormatter.str();
  	return theResult;
  }
  
  
  
  XalanFileOutputStream::XalanFileOutputStreamOpenException::XalanFileOutputStreamOpenException(
  		const XalanDOMString&	theFileName,
  		int					theErrorCode) :
  	XalanOutputStreamException(FormatMessageLocal(
  				"Error opening file: ",
  				theFileName,
  				theErrorCode),
  			XALAN_STATIC_UCODE_STRING("XalanFileOutputStreamOpenException"))
  {
  }
  
  
  
  XalanFileOutputStream::XalanFileOutputStreamOpenException::~XalanFileOutputStreamOpenException()
  {
  }
  
  
  
  XalanFileOutputStream::XalanFileOutputStreamWriteException::XalanFileOutputStreamWriteException(
  		const XalanDOMString&	theFileName,
  		int					theErrorCode) :
  	XalanOutputStreamException(FormatMessageLocal(
  				"Error writing file: ",
  				theFileName,
  				theErrorCode),
  			XALAN_STATIC_UCODE_STRING("XalanFileOutputStreamWriteException"))
  {
  }
  
  
  
  XalanFileOutputStream::XalanFileOutputStreamWriteException::~XalanFileOutputStreamWriteException()
  {
  }
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanFileOutputStream.hpp
  
  Index: XalanFileOutputStream.hpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  #if !defined(XALANFILEOUTPUTSTREAM_HEADER_GUARD_1357924680)
  #define XALANFILEOUTPUTSTREAM_HEADER_GUARD_1357924680
  
  
  
  // Base include file.  Must be first.
  #include <PlatformSupport/PlatformSupportDefinitions.hpp>
  
  
  
  #include <cstdio>
  #include <vector>
  
  
  
  // Base class header file.
  #include <PlatformSupport/XalanOutputStream.hpp>
  
  
  
  class XALAN_PLATFORMSUPPORT_EXPORT XalanFileOutputStream : public XalanOutputStream
  {
  public :
  
  	/**
  	 * Construct an XalanFileOutputStream exception object.
  	 * 
  	 * @param theFileName name of file causing the exception
  	 */
      XalanFileOutputStream(const XalanDOMString&		theFileName);
  
      virtual
  	~XalanFileOutputStream();
  
  
  	class XALAN_PLATFORMSUPPORT_EXPORT XalanFileOutputStreamOpenException : public XalanOutputStream::XalanOutputStreamException
  	{
  	public:
  
  		/**
  		 * Construct an XalanFileOutputStreamOpen exception object for an exception
  		 * that occurred on opening a text file stream.
  		 * 
  		 * @param theFileName  name of file causing the exception
  		 * @param theErrorCode number of error encountered
  		 */
  		XalanFileOutputStreamOpenException(
  			const XalanDOMString&	theFileName,
  			int						theErrorCode);
  
  		virtual
  		~XalanFileOutputStreamOpenException();
  	};
  
  	class XALAN_PLATFORMSUPPORT_EXPORT XalanFileOutputStreamWriteException : public XalanOutputStream::XalanOutputStreamException
  	{
  	public:
  
  		/**
  		 * Construct an XalanFileOutputStreamOpen exception object for an exception
  		 * that occurred while writing to a text file stream.
  		 * 
  		 * @param theFileName  name of file causing the exception
  		 * @param theErrorCode number of error encountered
  		 */
  		XalanFileOutputStreamWriteException(
  			const XalanDOMString&	theFileName,
  			int						theErrorCode);
  
  		virtual
  		~XalanFileOutputStreamWriteException();
  	};
  
  protected:
  
  	virtual void
  	writeData(
  			const char*		theBuffer,
  			unsigned long	theBufferLength);
  
  	virtual void
  	doFlush();
  
  private:
  
      // These are not implemented...
      XalanFileOutputStream(const XalanFileOutputStream&);
  
      XalanFileOutputStream&
  	operator=(const XalanFileOutputStream&);
  
  	void
  	flushBuffer();
  
  	void
  	doWrite(const XalanDOMChar*		theBuffer);
  
  	void
  	doWrite(
  			const char*		theBuffer,
  			unsigned long	theBufferLength);
  
      bool
  	operator==(const XalanFileOutputStream&) const;
  
  	// Data members...
  	const XalanDOMString	m_fileName;
  
  	FILE*					m_handle;
  };
  
  
  
  #endif	// XALANFILEOUTPUTSTREAM_HEADER_GUARD_1357924680
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanNullOutputStream.cpp
  
  Index: XalanNullOutputStream.cpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  // Class header file...
  #include "XalanNullOutputStream.hpp"
  
  
  
  XalanNullOutputStream::XalanNullOutputStream() :
  	XalanOutputStream()
  {
  }
  
  
  
  XalanNullOutputStream::~XalanNullOutputStream()
  {
  }
  
  
  
  void
  XalanNullOutputStream::flush()
  {
  }
  
  
  
  void
  XalanNullOutputStream::write(char	/* theChar */)
  {
  }
  
  
  
  void
  XalanNullOutputStream::write(XalanDOMChar	/* theChar */)
  {
  }
  
  
  
  void
  XalanNullOutputStream::write(const XalanDOMChar*		/* theBuffer */)
  {
  }
  
  
  
  void
  XalanNullOutputStream::write(const char*		/* theBuffer */)
  {
  }
  
  
  
  void
  XalanNullOutputStream::write(
  			const char*		/* theBuffer */,
  			unsigned long	/* theBufferLength */)
  {
  }
  
  
  
  void
  XalanNullOutputStream::write(
  			const XalanDOMChar*		/* theBuffer */,
  			unsigned long			/* theBufferLength */)
  {
  }
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanNullOutputStream.hpp
  
  Index: XalanNullOutputStream.hpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  #if !defined(XALANNULLOUTPUTSTREAM_HEADER_GUARD_1357924680)
  #define XALANNULLOUTPUTSTREAM_HEADER_GUARD_1357924680
  
  
  
  // Base include file.  Must be first.
  #include <PlatformSupport/PlatformSupportDefinitions.hpp>
  
  
  
  // Base class header file.
  #include <PlatformSupport/XalanOutputStream.hpp>
  
  
  
  class XALAN_PLATFORMSUPPORT_EXPORT XalanNullOutputStream : public XalanOutputStream
  {
  public :
  
  	explicit
      XalanNullOutputStream();
  
      virtual
  	~XalanNullOutputStream();
  
      // These are inherited from XalanOutputStream...
      virtual void
  	flush();
  
      virtual void
  	write(char	theChar);
  
      virtual void
  	write(XalanDOMChar	theChar);
  
      virtual void
  	write(const XalanDOMChar*	theBuffer);
  
      virtual void
  	write(const char*	theBuffer);
  
      virtual void
  	write(
  			const char*		theBuffer,
  			unsigned long	theBufferLength);
  
      virtual void
  	write(
  			const XalanDOMChar*		theBuffer,
  			unsigned long			theBufferLength);
  
  private:
  
      // These are not implemented...
      XalanNullOutputStream(const XalanNullOutputStream&);
  
      XalanNullOutputStream&
  	operator=(const XalanNullOutputStream&);
  
      bool
  	operator==(const XalanNullOutputStream&) const;
  };
  
  
  
  #endif	// NULLTEXTOUTPUTSTREAM_HEADER_GUARD_1357924680
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanOutputStream.cpp
  
  Index: XalanOutputStream.cpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  // Class header file...
  #include "XalanOutputStream.hpp"
  
  
  
  #include <util/TransService.hpp>
  #include <util/XMLException.hpp>
  
  
  
  #include "XalanTranscodingServices.hpp"
  
  
  
  XalanOutputStream::XalanOutputStream(
  			BufferType::size_type			theBufferSize,
  			TranscodeVectorType::size_type	theTranscoderBlockSize) :
  	m_transcoderBlockSize(theTranscoderBlockSize),
  	m_transcoder(0),
  	m_bufferSize(theBufferSize),
  	m_buffer(),
  	m_encoding(),
  	m_writeAsUTF16(false)
  {
  }
  
  
  
  XalanOutputStream::~XalanOutputStream()
  {
  	XalanTranscodingServices::destroyTranscoder(m_transcoder);
  }
  
  
  
  void
  XalanOutputStream::flush()
  {
  	flushBuffer();
  
  	doFlush();
  }
  
  
  
  void
  XalanOutputStream::write(char	theChar)
  {
  	write(&theChar, 1);
  }
  
  
  
  void
  XalanOutputStream::write(XalanDOMChar	theChar)
  {
  	write(&theChar, 1);
  }
  
  
  
  void
  XalanOutputStream::write(
  			const XalanDOMChar*		theBuffer,
  			unsigned long			theBufferLength)
  {
  	assert(theBuffer != 0);
  
  	if (theBufferLength + m_buffer.size() > m_bufferSize)
  	{
  		flushBuffer();
  	}
  
  	if (theBufferLength > m_bufferSize)
  	{
  		doWrite(theBuffer);
  	}
  	else
  	{
  		m_buffer.insert(m_buffer.end(),
  						theBuffer,
  						theBuffer + theBufferLength);
  	}
  }
  
  
  
  void
  XalanOutputStream::write(const XalanDOMChar*	theBuffer)
  {
  	if (theBuffer != 0)
  	{
  		write(theBuffer, length(theBuffer));
  	}
  }
  
  
  
  void
  XalanOutputStream::write(const char*	theBuffer)
  {
  	assert(theBuffer != 0);
  
  	flushBuffer();
  
  	writeData(theBuffer,
  		      strlen(theBuffer));
  }
  
  
  
  void
  XalanOutputStream::write(
  			const char*		theBuffer,
  			unsigned long	theBufferLength)
  {
  	assert(theBuffer != 0);
  
  	flushBuffer();
  
  	writeData(theBuffer,
  			  theBufferLength);
  }
  
  
  
  void
  XalanOutputStream::transcode(
  			const XalanDOMChar*		theBuffer,
  			TranscodeVectorType&	theDestination)
  {
  	// This is a special version that will short-cut when
  	// transocding to the local code page.  On platforms
  	// where XalanDOMChar == wchar_t, it saves copying
  	// to a temporary buffer for the purposes of null-
  	// terminating the string.
  	if (m_transcoder == 0)
  	{
  		if (TranscodeToLocalCodePage(
  				theBuffer,
  				theDestination) == false)
  		{
  			throw TranscodingException();
  		}
  	}
  	else
  	{
  		transcode(theBuffer, length(theBuffer), theDestination);
  	}
  }
  
  
  
  void
  XalanOutputStream::transcode(
  			const XalanDOMChar*		theBuffer,
  			unsigned long			theBufferLength,
  			TranscodeVectorType&	theDestination)
  {
  	if (m_transcoder == 0)
  	{
  		if (TranscodeToLocalCodePage(
  				theBuffer,
  				theBufferLength,
  				theDestination) == false)
  		{
  			throw TranscodingException();
  		}
  	}
  	else
  	{
  		bool					fDone = false;
  
  		// Keep track of the total bytes we've added to the
  		// destination vector, and the total bytes we've
  		// eaten from theBuffer.
  		unsigned int			theTotalBytesFilled = 0;
  		unsigned int			theTotalBytesEaten = 0;
  
  		// Keep track of the current position in the input buffer,
  		// and amount remaining in the buffer, since we may not be
  		// able to transcode it all at once.
  		const XalanDOMChar*		theBufferPosition = theBuffer;
  		unsigned int			theRemainingBufferLength = theBufferLength;
  
  		// Keep track of the destination size, and the target size, which is
  		// the size of the destination that has not yet been filled with
  		// transcoded characters.  Double the buffer size, in case we're
  		// transcoding to a 16-bit encoding.
  		// $$$ ToDo: We need to know the size of an encoding, so we can
  		// do the right thing with the destination size.
  		unsigned int			theDestinationSize = theBufferLength * 2;
  		unsigned int			theTargetSize = theDestinationSize;
  
  		do
  		{
  			// Resize the buffer...
  			theDestination.resize(theDestinationSize + 1);
  
  			unsigned int						theSourceBytesEaten = 0;
  			unsigned int						theTargetBytesEaten = 0;
  
  			XalanTranscodingServices::eCode		theResult =
  				m_transcoder->transcode(
  						theBufferPosition,
  						theRemainingBufferLength,
  #if defined(XALAN_OLD_STYLE_CASTS)
  						(XMLByte*)&theDestination[0] + theTotalBytesFilled,
  #else
  						reinterpret_cast<XMLByte*>(&theDestination[0]) + theTotalBytesFilled,
  #endif
  						theTargetSize,
  						theSourceBytesEaten,
  						theTargetBytesEaten);
  
  			if(theResult != XalanTranscodingServices::OK)
  			{
  				throw TranscodingException();
  			}
  
  			theTotalBytesFilled += theTargetBytesEaten;
  			theTotalBytesEaten += theSourceBytesEaten;
  
  			if (theTotalBytesEaten == theBufferLength)
  			{
  				fDone = true;
  			}
  			else
  			{
  				assert(theTotalBytesEaten < theBufferLength);
  
  				// Update everything...
  				theBufferPosition += theSourceBytesEaten;
  				theRemainingBufferLength -= theSourceBytesEaten;
  
  				// The new target size will always be the
  				// current destination size, since we
  				// grow by a factor of 2.  This will
  				// need to change if the factor is
  				// every changed.
  				theTargetSize = theDestinationSize;
  
  				// Grow the destination by a factor of
  				// two 2.  See the previous comment if
  				// you want to change this.
  				theDestinationSize = theDestinationSize * 2;
  			}
  		} while(fDone == false);
  
  		// Resize things, if there are any extra bytes...
  		if (theDestination.size() != theTotalBytesFilled)
  		{
  			theDestination.resize(theTotalBytesFilled);
  		}
  	}
  }
  
  
  
  const XalanDOMString&
  XalanOutputStream::getOutputEncoding() const
  {
  	return m_encoding;
  }
  
  
  
  void
  XalanOutputStream::setOutputEncoding(const XalanDOMString&	theEncoding)
  {
  	// Flush, just in case.  This should problably be an error...
  	flushBuffer();
  
  	XalanTranscodingServices::destroyTranscoder(m_transcoder);
  
  	XalanTranscodingServices::eCode		theCode = XalanTranscodingServices::OK;
  
  	// This turns on an optimization that we can only do if
  	// XalanDOMChar == sizeof(ushort).  See doWrite().
  #if !defined(XALAN_XALANDOMCHAR_USHORT_MISMATCH)
  	if (XalanTranscodingServices::encodingIsUTF16(theEncoding) == true)
  	{
  		m_writeAsUTF16 = true;
  	}
  	else
  #endif
  	{
  		m_transcoder = XalanTranscodingServices::makeNewTranscoder(
  					theEncoding,
  					theCode,
  					m_transcoderBlockSize);
  
  		if (theCode == XalanTranscodingServices::UnsupportedEncoding)
  		{
  			throw UnsupportedEncodingException(theEncoding);
  		}
  		else if (theCode != XalanTranscodingServices::OK)
  		{
  			throw TranscoderInternalFailureException(theEncoding);
  		}
  
  		assert(m_transcoder != 0);
  	}
  
  	m_encoding = theEncoding;
  
  	const XalanTranscodingServices::XalanXMLByteVectorType	theProlog =
  		XalanTranscodingServices::getStreamProlog(theEncoding);
  
  #if defined(XALAN_OLD_STYLE_CASTS)
  	write((const char*)theProlog[0], theProlog.size());
  #else
  	write(reinterpret_cast<const char*>(&theProlog[0]), theProlog.size());
  #endif
  }
  
  
  
  void
  XalanOutputStream::flushBuffer()
  {
  	if (m_buffer.size() > 0)
  	{
  		m_buffer.push_back(0);
  
  		doWrite(m_buffer.begin());
  
  		m_buffer.clear();
  	}
  }
  
  
  
  void
  XalanOutputStream::doWrite(const XalanDOMChar*	theBuffer)
  {
  	assert(theBuffer != 0);
  
  	try
  	{
  		if (m_writeAsUTF16 == true)
  		{
  			assert(sizeof(XalanDOMChar) == sizeof(char) * 2);
  
  			// This is a hack to write UTF-16 through as if it
  			// were just chars.  Saves lots of time "transcoding."
  #if defined(XALAN_OLD_STYLE_CASTS)
  			writeData((const char*)theBuffer, length(theBuffer) * 2);
  #else
  			writeData(reinterpret_cast<const char*>(theBuffer), length(theBuffer) * 2);
  #endif
  		}
  		else
  		{
  			TranscodeVectorType		theTranscodedData;
  
  			transcode(theBuffer, theTranscodedData);
  
  			assert(&theTranscodedData[0] != 0);
  
  			writeData(&theTranscodedData[0],
  					  theTranscodedData.size());
  		}
  	}
  	catch(const XalanOutputStreamException&)
  	{
  		// Have to catch this error and flush any output remaining...
  		m_buffer.clear();
  
  		throw;
  	}
  }
  
  
  
  void
  XalanOutputStream::setBufferSize(BufferType::size_type		theBufferSize)
  {
  	flushBuffer();
  
  	m_bufferSize = theBufferSize;
  
  	if (m_buffer.size() < m_bufferSize)
  	{
  		// Enlarge the buffer...
  		m_buffer.reserve(theBufferSize);
  	}
  	else if (m_buffer.size() > m_bufferSize)
  	{
  		// Shrink the buffer.
  
  		// Create a temp buffer and make it
  		// the correct size.
  		BufferType	temp;
  		
  		temp.reserve(theBufferSize);
  		
  		// Swap temp with m_buffer so that
  		// m_buffer is now the correct size.
  		temp.swap(m_buffer);
  	}
  }
  
  
  
  XalanOutputStream::XalanOutputStreamException::XalanOutputStreamException(
  			const XalanDOMString&	theMessage,
  			const XalanDOMString&	theType) :
  	XSLException(theMessage, theType)
  {
  }
  
  
  
  XalanOutputStream::XalanOutputStreamException::~XalanOutputStreamException()
  {
  }
  
  
  
  XalanOutputStream::UnknownEncodingException::UnknownEncodingException() :
  	XalanOutputStreamException(
  			XALAN_STATIC_UCODE_STRING("Unknown error occurred while transcoding!"),
  			XALAN_STATIC_UCODE_STRING("UnknownEncodingException"))
  {
  }
  
  
  
  XalanOutputStream::UnknownEncodingException::~UnknownEncodingException()
  {
  }
  
  
  
  XalanOutputStream::UnsupportedEncodingException::UnsupportedEncodingException(const XalanDOMString&	theEncoding) :
  	XalanOutputStreamException(
  			XALAN_STATIC_UCODE_STRING("Unsupported encoding: ") + theEncoding,
  			XALAN_STATIC_UCODE_STRING("UnsupportedEncodingException")),
  	m_encoding(theEncoding)
  {
  }
  
  
  
  XalanOutputStream::UnsupportedEncodingException::~UnsupportedEncodingException()
  {
  }
  
  
  
  XalanOutputStream::TranscoderInternalFailureException::TranscoderInternalFailureException(const XalanDOMString&	theEncoding) :
  	XalanOutputStreamException(
  			XALAN_STATIC_UCODE_STRING("Unknown error occurred while transcoding to ") +
  					theEncoding +
  					XALAN_STATIC_UCODE_STRING("!"),
  			XALAN_STATIC_UCODE_STRING("TranscoderInternalFailureException")),
  	m_encoding(theEncoding)
  {
  }
  
  
  
  XalanOutputStream::TranscoderInternalFailureException::~TranscoderInternalFailureException()
  {
  }
  
  
  
  XalanOutputStream::TranscodingException::TranscodingException() :
  	XalanOutputStreamException(
  			XALAN_STATIC_UCODE_STRING("An error occurred while transcoding!"),
  			XALAN_STATIC_UCODE_STRING("TranscodingException"))
  {
  }
  
  
  
  XalanOutputStream::TranscodingException::~TranscodingException()
  {
  }
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanOutputStream.hpp
  
  Index: XalanOutputStream.hpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  #if !defined(XALANOUTPUTSTREAM_HEADER_GUARD_1357924680)
  #define XALANOUTPUTSTREAM_HEADER_GUARD_1357924680
  
  
  
  // Base include file.  Must be first.
  #include <PlatformSupport/PlatformSupportDefinitions.hpp>
  
  
  
  #include <vector>
  
  
  
  #include <XalanDOM/XalanDOMString.hpp>
  
  
  
  #include <PlatformSupport/XSLException.hpp>
  
  
  
  class XalanOutputTranscoder;
  
  
  
  class XALAN_PLATFORMSUPPORT_EXPORT XalanOutputStream
  {
  public :
  
  	enum { eDefaultBufferSize = 512, eDefaultTranscoderBlockSize = 1024 };
  
  
  #if defined(XALAN_NO_NAMESPACES)
  	typedef vector<XalanDOMChar>		BufferType;
  
  	typedef vector<char>				TranscodeVectorType;
  #else
  	typedef std::vector<XalanDOMChar>	BufferType;
  
  	typedef std::vector<char>			TranscodeVectorType;
  #endif
  
  	explicit
  	XalanOutputStream(
  			BufferType::size_type			theBufferSize = eDefaultBufferSize,
  			TranscodeVectorType::size_type	theTranscoderBlockSize = eDefaultTranscoderBlockSize);
  
  	virtual
  	~XalanOutputStream();
  
  	/**
  	 * Flush the stream's buffer.
  	 */
      virtual void
  	flush();
  
  	/**
  	 * Write a character to the output stream.  The character
  	 * will not be transcoded.
  	 *
  	 * @param theChar       the character to write
  	 */
      virtual void
  	write(char	theChar);
  
  	/**
  	 * Write a wide character to the output stream.  The character
  	 * will be transcoded, if an output encoding is specified.
  	 *
  	 * @param theChar       the character to write
  	 */
      virtual void
  	write(XalanDOMChar	theChar);
  
  	/**
  	 * Write a null-terminated string to the output file.  The character
  	 * will not be transcoded.
  	 *
  	 * @param theBuffer       character buffer to write
  	 */
      virtual void
  	write(const char*	theBuffer);
  
  	/**
  	 * Write a null-terminated wide string to the output file.  The string
  	 * will be transcoded, if an output encoding is specified.
  	 *
  	 * @param theBuffer       character buffer to write
  	 */
      virtual void
  	write(const XalanDOMChar*	theBuffer);
  
  	/**
  	 * Write a specified number of characters to the output stream.  The string
  	 * will not be transcoded.
  	 *
  	 * @param theBuffer       character buffer to write
  	 * @param theBufferLength number of characters to write
  	 */
      virtual void
  	write(
  			const char*		theBuffer,
  			unsigned long	theBufferLength);
  
  	/**
  	 * Write a specified number of characters to the output stream.  The string
  	 * will be transcoded, if an output encoding is specified.
  	 *
  	 * @param theBuffer       character buffer to write
  	 * @param theBufferLength number of characters to write
  	 */
      virtual void
  	write(
  			const XalanDOMChar*		theBuffer,
  			unsigned long			theBufferLength);
  
  	/**
  	 * Get the output encoding for the stream.
  	 *
  	 * @return The encoding name
  	 */
  	virtual const XalanDOMString&
  	getOutputEncoding() const;
  
  	/**
  	 * Set the output encoding for the stream.
  	 *
  	 * @param theEncoding The encoding name
  	 */
  	virtual void
  	setOutputEncoding(const XalanDOMString&		theEncoding);
  
  	/**
  	 * Set the size of the output buffer.
  	 *
  	 * @param theBufferSize The buffer size.
  	 */
  	virtual void
  	setBufferSize(BufferType::size_type		theBufferSize);
  
  
  	class XALAN_PLATFORMSUPPORT_EXPORT XalanOutputStreamException : public XSLException
  	{
  	public:
  
  		XalanOutputStreamException(
  			const XalanDOMString&	theMessage,
  			const XalanDOMString&	theType);
  
  		virtual
  		~XalanOutputStreamException();
  	};
  
  	class XALAN_PLATFORMSUPPORT_EXPORT UnknownEncodingException : public XalanOutputStreamException
  	{
  	public:
  
  		explicit
  		UnknownEncodingException();
  
  		virtual
  		~UnknownEncodingException();
  	};
  
  	class XALAN_PLATFORMSUPPORT_EXPORT UnsupportedEncodingException : public XalanOutputStreamException
  	{
  	public:
  
  		UnsupportedEncodingException(const XalanDOMString&	theEncoding);
  
  		virtual
  		~UnsupportedEncodingException();
  
  		const XalanDOMString&
  		getEncoding() const
  		{
  			return m_encoding;
  		}
  
  	private:
  
  		const XalanDOMString&	m_encoding;
  	};
  
  	class XALAN_PLATFORMSUPPORT_EXPORT TranscoderInternalFailureException : public XalanOutputStreamException
  	{
  	public:
  
  		TranscoderInternalFailureException(const XalanDOMString&	theEncoding);
  
  		virtual
  		~TranscoderInternalFailureException();
  
  		const XalanDOMString&
  		getEncoding() const
  		{
  			return m_encoding;
  		}
  
  	private:
  
  		const XalanDOMString&	m_encoding;
  	};
  
  	class XALAN_PLATFORMSUPPORT_EXPORT TranscodingException : public XalanOutputStreamException
  	{
  	public:
  
  		explicit
  		TranscodingException();
  
  		virtual
  		~TranscodingException();
  	};
  
  protected:
  
  	/**
  	 * Transcode a null-terminated wide string.
  	 *
  	 * @param theBuffer The string to transcode.
  	 * @param theDestination The destination vector.
  	 */
  	void
  	transcode(
  			const XalanDOMChar*		theBuffer,
  			TranscodeVectorType&	theDestination);
  
  	/**
  	 * Transcode a wide string.
  	 *
  	 * @param theBuffer The string to transcode.
  	 * @param theBufferLength The length of the string.
  	 * @param theDestination The destination vector.
  	 */
  	void
  	transcode(
  			const XalanDOMChar*		theBuffer,
  			unsigned long			theBufferLength,
  			TranscodeVectorType&	theDestination);
  
  	virtual void
  	writeData(const char*		theBuffer,
  			  unsigned long		theBufferLength) = 0;
  
  	virtual void
  	doFlush() = 0;
  
  private:
  
      // These are not implemented...
      XalanOutputStream(const XalanOutputStream&);
  
      XalanOutputStream&
  	operator=(const XalanOutputStream&);
  
      bool
  	operator==(const XalanOutputStream&) const;
  
  	// Utility functions...
  	void
  	flushBuffer();
  
  	void
  	doWrite(const XalanDOMChar*		theBuffer);
  
  
  	const TranscodeVectorType::size_type	m_transcoderBlockSize;
  
  	XalanOutputTranscoder*					m_transcoder;
  
  	BufferType::size_type					m_bufferSize;
  
  	BufferType								m_buffer;
  
  	XalanDOMString							m_encoding;
  
  	bool									m_writeAsUTF16;
  };
  
  
  
  #endif	// XALANOUTPUTSTREAM_HEADER_GUARD_1357924680
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanOutputStreamPrintWriter.cpp
  
  Index: XalanOutputStreamPrintWriter.cpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  // Class header file.
  #include "XalanOutputStreamPrintWriter.hpp"
  
  
  
  #include <cassert>
  
  
  
  #include <XalanDOM/XalanDOMString.hpp>
  
  
  
  #include "DOMStringHelper.hpp"
  #include "XalanOutputStream.hpp"
  
  
  
  XalanOutputStreamPrintWriter::XalanOutputStreamPrintWriter(
  			XalanOutputStream&	theOutputStream,
  			bool				fAutoFlush) :
  	PrintWriter(fAutoFlush),
  	m_OutputStream(theOutputStream)
  {
  }
  
  
  
  XalanOutputStreamPrintWriter::~XalanOutputStreamPrintWriter()
  {
  	flush();
  }
  
  
  
  bool
  XalanOutputStreamPrintWriter::checkError() const
  {
  	return false;
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::close()
  {
  	flush();
  }
  
  
  void
  XalanOutputStreamPrintWriter::flush()
  {
  	m_OutputStream.flush();
  }
  
  
  
  XalanOutputStream*
  XalanOutputStreamPrintWriter::getStream()
  {
  	return &m_OutputStream;
  }
  
  
  
  const XalanOutputStream*
  XalanOutputStreamPrintWriter::getStream() const
  {
  	return &m_OutputStream;
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::write(
  			const char*		s,
  			unsigned int	theOffset,
  			unsigned int	theLength)
  {
  	assert(s != 0);
  
  	if (theLength == -1)
  	{
  		if (theOffset == 0)
  		{
  			m_OutputStream.write(s);
  		}
  		else
  		{
  			m_OutputStream.write(s + theOffset);
  		}
  	}
  	else
  	{
  		const long	theStopIndex = theOffset + theLength;
  
  		for (long i = theOffset; i < theStopIndex; i++)
  		{
  			m_OutputStream.write(s[i]);
  		}
  	}
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::write(
  			const XMLCh*	s,
  			unsigned int	theOffset,
  			unsigned int	theLength)
  {
  	assert(s != 0);
  
  	if (theLength == -1)
  	{
  		if (theOffset == 0)
  		{
  			m_OutputStream.write(s);
  		}
  		else
  		{
  			m_OutputStream.write(s + theOffset);
  		}
  	}
  	else
  	{
  		const long	theStopIndex = theOffset + theLength;
  
  		for (long i = theOffset; i < theStopIndex; i++)
  		{
  			m_OutputStream.write(s[i]);
  		}
  	}
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::write(XMLCh	c)
  {
  	m_OutputStream.write(c);
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::write(
  			const DOMString&	s,
  			unsigned int		theOffset,
  			unsigned int		theLength)
  {
  	write(c_wstr(s), theOffset, theLength);
  }
  
  
  
  #if !defined(XALAN_BOOL_AS_INT)
  void
  XalanOutputStreamPrintWriter::print(bool	b)
  {
  	if (b == true)
  	{
  		print(s_trueString);
  	}
  	else
  	{
  		print(s_falseString);
  	}
  }
  #endif
  
  
  
  void
  XalanOutputStreamPrintWriter::print(char	c)
  {
  	write(c);
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::print(
  			const char*		s,
  			unsigned int	theLength)
  {
  	write(s,
  		  0,
  		  theLength);
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::print(
  			const XMLCh*	s,
  			unsigned int	theLength)
  {
  	assert(s != 0);
  	assert(theLength >= 0 || theLength == -1);
  
  	write(s,
  		  0,
  		  theLength);
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::print(double	d)
  {
  	m_OutputStream.write(c_wstr(DoubleToDOMString(d)));
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::print(int	i)
  {
  	m_OutputStream.write(c_wstr(LongToDOMString(i)));
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::print(long	l)
  {
  	m_OutputStream.write(c_wstr(LongToDOMString(l)));
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::print(const DOMString&	s)
  {
  	m_OutputStream.write(c_wstr(s));
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::println()
  {
  	m_OutputStream.write(c_wstr(s_newlineString));
  
  	flush();
  }
  
  
  
  #if !defined(XALAN_BOOL_AS_INT)
  void
  XalanOutputStreamPrintWriter::println(bool	b)
  {
  	print(b);
  
  	println();
  }
  #endif
  
  
  
  void
  XalanOutputStreamPrintWriter::println(char	c)
  {
  	print(c);
  
  	println();
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::println(
  			const char*		s,
  			unsigned int	theLength)
  {
  	print(s, theLength);
  
  	println();
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::println(
  			const XMLCh*	s,
  			unsigned int	theLength)
  {
  	print(s, theLength);
  
  	println();
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::println(double	d)
  {
  	print(d);
  
  	println();
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::println(int		i)
  {
  	print(i);
  
  	println();
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::println(long	l)
  {
  	print(l);
  
  	println();
  }
  
  
  
  void
  XalanOutputStreamPrintWriter::println(const DOMString&	s)
  {
  	print(s);
  
  	println();
  }
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanOutputStreamPrintWriter.hpp
  
  Index: XalanOutputStreamPrintWriter.hpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  #if !defined(XALANOUTPUTSTREAMPRINTWRITER_HEADER_GUARD_1357924680)
  #define XALANOUTPUTSTREAMPRINTWRITER_HEADER_GUARD_1357924680
  
  
  
  // Base include file.  Must be first.
  #include <PlatformSupport/PlatformSupportDefinitions.hpp>
  
  
  
  #include <PlatformSupport/PrintWriter.hpp>
  
  
  
  class XalanOutputStream;
  
  
  
  class XALAN_PLATFORMSUPPORT_EXPORT XalanOutputStreamPrintWriter : public PrintWriter
  {
  public:
  
  	/**
  	 * Construct a XalanOutputStreamPrintWriter instance. 
  	 *
  	 * @param theOutputStream output stream to write
  	 * @param fAutoFlush      if true, the output will not be buffered
  	 */
  	XalanOutputStreamPrintWriter(
  			XalanOutputStream&	theOutputStream,
  			bool				fAutoFlush = false);
  
  	virtual
  	~XalanOutputStreamPrintWriter();
  
  	// These methods are inherited from PrintWriter ...
  
  	virtual bool
      checkError() const;
  
  	virtual void
  	close();
  
  	virtual void
  	flush();
  
  	virtual XalanOutputStream*
  	getStream();
  
  	virtual const XalanOutputStream*
  	getStream() const;
  
  
  	// Output functions...
  
  	virtual void
  	write(const char*	s,
  		  unsigned int	theOffset = 0,
  		  unsigned int	theLength = UINT_MAX);
  
  	virtual void
  	write(const XalanDOMChar*	s,
  		  unsigned int			theOffset = 0,
  		  unsigned int			theLength = UINT_MAX);
  
  	virtual void
  	write(XalanDOMChar		c);
  
  	virtual void
  	write(const XalanDOMString&		s,
  		  unsigned int				theOffset = 0,
  		  unsigned int				theLength = UINT_MAX);
  
  #if !defined(XALAN_BOOL_AS_INT)
  	virtual void
  	print(bool	b);
  #endif
  
  	virtual void
  	print(char	c);
  
  	virtual void
  	print(const char*	s,
  		  unsigned int	theLength = UINT_MAX);
  
  	virtual void
  	print(const XalanDOMChar*	s,
  		  unsigned int			theLength = UINT_MAX);
  
  	virtual void
  	print(double	d);
  
  	virtual void
  	print(int	i);
  
  	virtual void
  	print(long	l);
  
  	virtual void
  	print(const XalanDOMString&		s);
  
  	virtual void
  	println();
  
  #if !defined(XALAN_BOOL_AS_INT)
  	virtual void
  	println(bool	b);
  #endif
  
  	virtual void
  	println(char	c);
  
  	virtual void
  	println(const char*		s,
  		    unsigned int	theLength = UINT_MAX);
  
  	virtual void
  	println(const XalanDOMChar*		s,
  			unsigned int			theLength = UINT_MAX);
  
  	virtual void
  	println(double	d);
  
  	virtual void
  	println(int		i);
  
  	virtual void
  	println(long	l);
  
  	virtual void
  	println(const XalanDOMString&	s);
  
  protected:
  
  	XalanOutputStream&	m_OutputStream;
  
  private:
  
  	// Not implemented
  	XalanOutputStreamPrintWriter(const XalanOutputStreamPrintWriter&);
  
  	XalanOutputStreamPrintWriter&
  	operator=(const XalanOutputStreamPrintWriter&);
  
  	bool
  	operator==(const XalanOutputStreamPrintWriter&);
  };
  
  
  
  #endif	// XALANOUTPUTSTREAMPRINTWRITER_HEADER_GUARD_1357924680
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanStdOutputStream.cpp
  
  Index: XalanStdOutputStream.cpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  // Class header file...
  #include "XalanStdOutputStream.hpp"
  
  
  
  #include <cerrno>
  #include <iostream>
  #include <strstream>
  
  
  
  #include <PlatformSupport/DOMStringHelper.hpp>
  
  
  
  #if !defined(XALAN_NO_NAMESPACES)
  using std::ostream;
  using std::cerr;
  #endif
  
  
  
  XalanStdOutputStream::XalanStdOutputStream(ostream&	theOutputStream) :
  	XalanOutputStream(),
  	m_outputStream(theOutputStream)
  {
  	// This will make sure that cerr is not buffered...
  	if (&m_outputStream == &cerr)
  	{
  		setBufferSize(0);
  	}
  }
  
  
  
  XalanStdOutputStream::~XalanStdOutputStream()
  {
  }
  
  
  
  void
  XalanStdOutputStream::doFlush()
  {
  	m_outputStream.flush();
  }
  
  
  
  void
  XalanStdOutputStream::writeData(
  			const char*		theBuffer,
  			unsigned long	theBufferLength)
  {
  	m_outputStream.write(theBuffer, theBufferLength);
  
  	if(!m_outputStream)
  	{
  		throw XalanStdOutputStreamWriteException(errno);
  	}
  }
  
  
  
  static DOMString
  FormatMessageLocal(
  			const DOMString&	theMessage,
  			int					theErrorCode)
  {
  #if !defined(XALAN_NO_NAMESPACES)
  using std::ostrstream;
  #endif
  
  	DOMString	theResult(clone(theMessage));
  
  	ostrstream   theFormatter;
  
  	theFormatter << ".  The error code was "
  				 << theErrorCode
  				 << "." << '\0';
  
  	theResult += theFormatter.str();
  
  	delete theFormatter.str();
  	return theResult;
  }
  
  
  
  XalanStdOutputStream::XalanStdOutputStreamWriteException::XalanStdOutputStreamWriteException(
  		int					theErrorCode) :
  	XalanOutputStreamException(FormatMessageLocal("Error writing to standard stream!",
  													   theErrorCode),
  								    XALAN_STATIC_UCODE_STRING("XercesStdTextOutputStreamWriteException"))
  {
  }
  
  
  
  XalanStdOutputStream::XalanStdOutputStreamWriteException::~XalanStdOutputStreamWriteException()
  {
  }
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanStdOutputStream.hpp
  
  Index: XalanStdOutputStream.hpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  #if !defined(XALANSTDOUTPUTSTREAM_HEADER_GUARD_1357924680)
  #define XALANSTDOUTPUTSTREAM_HEADER_GUARD_1357924680
  
  
  
  // Base include file.  Must be first.
  #include <PlatformSupport/PlatformSupportDefinitions.hpp>
  
  
  
  #if defined(XALAN_NO_IOSFWD)
  #include <ostream>
  #else
  #include <iosfwd>
  #endif
  
  
  
  // Base class header file.
  #include <PlatformSupport/XalanOutputStream.hpp>
  
  
  
  // A base class for all text output streams.
  class XALAN_PLATFORMSUPPORT_EXPORT XalanStdOutputStream : public XalanOutputStream
  {
  public:
  
  	/**
  	 * Construct a XalanStdOutputStream instance for output to the
  	 * standard output device.
  	 *
  	 * @param theOutputStream output stream to use
  	 */
      XalanStdOutputStream(
  #if defined (XALAN_NO_NAMESPACES)
  			ostream&		theOutputStream);
  #else
  			std::ostream&	theOutputStream);
  #endif
  
      virtual
  	~XalanStdOutputStream();
  
  	class XALAN_PLATFORMSUPPORT_EXPORT XalanStdOutputStreamWriteException : public XalanOutputStream::XalanOutputStreamException
  	{
  	public:
  
  		XalanStdOutputStreamWriteException(
  			int					theErrorCode);
  
  		virtual
  		~XalanStdOutputStreamWriteException();
  
  	};
  
  protected:
  
  	virtual void
  	writeData(const char*		theBuffer,
  			  unsigned long		theBufferLength);
  
  	virtual void
  	doFlush();
  
  private:
  
      // These are not implemented...
      XalanStdOutputStream(const XalanStdOutputStream&);
  
      XalanStdOutputStream&
  	operator=(const XalanStdOutputStream&);
  
  	// Data members...
  #if defined (XALAN_NO_NAMESPACES)
  	ostream&		m_outputStream;
  #else
  	std::ostream&	m_outputStream;
  #endif
  };
  
  
  
  #endif	// XERCESSTDTEXTOUTPUTSTREAM_HEADER_GUARD_1357924680
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanToXercesTranscoderWrapper.cpp
  
  Index: XalanToXercesTranscoderWrapper.cpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2000 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  #include "XalanToXercesTranscoderWrapper.hpp"
  
  
  
  #include <cassert>
  
  
  
  #include <util/TransService.hpp>
  #include <util/XMLException.hpp>
  
  
  
  XalanToXercesTranscoderWrapper::XalanToXercesTranscoderWrapper(XMLTranscoder*	theTranscoder) :
  	XalanOutputTranscoder(),
  	m_transcoder(theTranscoder)
  {
  }
  
  
  
  XalanToXercesTranscoderWrapper::~XalanToXercesTranscoderWrapper()
  {
  	delete m_transcoder;
  }
  
  
  
  XalanToXercesTranscoderWrapper::eCode
  XalanToXercesTranscoderWrapper::transcode(
  			const XalanDOMChar*		theSourceData,
  			unsigned int			theSourceCount,
  			XalanXMLByte*			theTarget,
  			unsigned int			theTargetSize,
  			unsigned int&			theSourceCharsTranscoded,
  			unsigned int&			theTargetBytesUsed)
  {
  	eCode	theCode = XalanTranscodingServices::OK;
  
  	try
  	{
  		theTargetBytesUsed = m_transcoder->transcodeTo(
  			theSourceData,
  			theSourceCount,
  			theTarget,
  			theTargetSize,
  			theSourceCharsTranscoded,
  			XMLTranscoder::UnRep_Throw);
  	}
  	catch(const XMLException&)
  	{
  		theSourceCharsTranscoded = 0;
  		theTargetBytesUsed = 0;
  		theCode = XalanTranscodingServices::InternalFailure;
  	}
  
  	return theCode;
  }
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanToXercesTranscoderWrapper.hpp
  
  Index: XalanToXercesTranscoderWrapper.hpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2000 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  #if !defined(XALANTOXERCESTRANSCODERWRAPPER_HEADER_GUARD_1357924680)
  #define XALANTOXERCESTRANSCODERWRAPPER_HEADER_GUARD_1357924680
  
  
  
  // Base include file.  Must be first.
  #include <PlatformSupport/PlatformSupportDefinitions.hpp>
  
  
  
  // Base class header file...
  #include <PlatformSupport/XalanTranscodingServices.hpp>
  
  
  
  class XMLTranscoder;
  
  
  
  class XALAN_PLATFORMSUPPORT_EXPORT XalanToXercesTranscoderWrapper : public XalanOutputTranscoder
  {
  public:
  
  	explicit
  	XalanToXercesTranscoderWrapper(XMLTranscoder*	theTranscoder);
     
  	virtual
  	~XalanToXercesTranscoderWrapper();
  
  	virtual eCode
  	transcode(
  			const XalanDOMChar*		theSourceData,
  			unsigned int			theSourceCount,
  			XalanXMLByte*			theTarget,
  			unsigned int			theTargetSize,
  			unsigned int&			theSourceCharsTranscoded,
  			unsigned int&			theTargetBytesUsed);
  
  private:
  
  	// Not implemented...
  	XalanToXercesTranscoderWrapper(const XalanToXercesTranscoderWrapper&);
  
  	XalanToXercesTranscoderWrapper&
  	operator=(const XalanToXercesTranscoderWrapper&);
  
  
  	XMLTranscoder* const	m_transcoder;
  };
  
  
  
  #endif	// XALANTOXERCESTRANSCODERWRAPPER_HEADER_GUARD_1357924680
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanTranscodingServices.cpp
  
  Index: XalanTranscodingServices.cpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2000 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  #include "XalanTranscodingServices.hpp"
  
  
  
  #include <cassert>
  
  
  
  #include <util/PlatformUtils.hpp>
  #include <util/TransService.hpp>
  
  
  
  #include "DOMStringHelper.hpp"
  #include "XalanToXercesTranscoderWrapper.hpp"
  #include "XalanUTF16Transcoder.hpp"
  
  
  
  const XalanDOMChar 	XalanTranscodingServices::s_UTF8String[] =
  {
  	XalanUnicode::charLetter_U,
  	XalanUnicode::charLetter_T,
  	XalanUnicode::charLetter_F, 
  	XalanUnicode::charHyphenMinus,
  	XalanUnicode::charDigit_8,
  	0
  };
  
  
  
  const XalanDOMChar 	XalanTranscodingServices::s_UTF16String[] =
  {
  	XalanUnicode::charLetter_U,
  	XalanUnicode::charLetter_T,
  	XalanUnicode::charLetter_F, 
  	XalanUnicode::charHyphenMinus,
  	XalanUnicode::charDigit_1,
  	XalanUnicode::charDigit_6,
  	0
  };
  
  
  
  static XalanTranscodingServices::eCode
  translateCode(XMLTransService::Codes	theCode)
  {
  	if (theCode == XMLTransService::Ok)
  	{
  		return XalanTranscodingServices::OK;
  	}
  	else if (theCode == XMLTransService::UnsupportedEncoding)
  	{
  		return XalanTranscodingServices::UnsupportedEncoding;
  	}
  	else if (theCode == XMLTransService::InternalFailure)
  	{
  		return XalanTranscodingServices::InternalFailure;
  	}
  	else
  	{
  		assert(theCode == XMLTransService::SupportFilesNotFound);
  
  		return XalanTranscodingServices::SupportFilesNotFound;
  	}
  }
  
  
  
  XalanOutputTranscoder*
  XalanTranscodingServices::makeNewTranscoder(
  			const XalanDOMString&	theEncodingName,
  			eCode&					theResult,
  			unsigned int			theBlockSize)
  {
  	assert(XMLPlatformUtils::fgTransService != 0);
  
  	XalanOutputTranscoder*	theTranscoder = 0;
  
  	XMLTransService::Codes	theCode = XMLTransService::Ok;
  
  	if (encodingIsUTF16(theEncodingName) == true)
  	{
  		theResult = OK;
  
  		theTranscoder = new XalanUTF16Transcoder;
  	}
  	else
  	{
  		XMLTranscoder*	theXercesTranscoder = 
  			XMLPlatformUtils::fgTransService->makeNewTranscoderFor(
  					c_wstr(theEncodingName),
  					theCode,
  					theBlockSize);
  
  		theResult = translateCode(theCode);
  		assert(theResult == XMLTransService::Ok ||
  			   theXercesTranscoder == 0);
  
  		if (theResult == XMLTransService::Ok)
  		{
  			theTranscoder = new XalanToXercesTranscoderWrapper(theXercesTranscoder);
  		}
  	}
  
  	return theTranscoder;
  }
  
  
  
  void
  XalanTranscodingServices::destroyTranscoder(XalanOutputTranscoder*	theTranscoder)
  {
  	delete theTranscoder;
  }
  
  
  
  bool
  XalanTranscodingServices::encodingIsUTF16(const XalanDOMChar*	theEncodingName)
  {
  	return compareIgnoreCase(c_wstr(theEncodingName), s_UTF16String) == 0 ? true : false;
  }
  
  
  bool
  XalanTranscodingServices::encodingIsUTF16(const XalanDOMString&		theEncodingName)
  {
  	return encodingIsUTF16(c_wstr(theEncodingName));
  }
  
  
  
  // Some vectors for containing byte-order marks, or other leading bytes
  // that would indicate the encoding.
  static const XalanTranscodingServices::XalanXMLByteVectorType	s_dummyVector;
  static XalanTranscodingServices::XalanXMLByteVectorType			s_UTF8Vector;
  static XalanTranscodingServices::XalanXMLByteVectorType			s_UTF16Vector;
  
  
  
  const XalanTranscodingServices::XalanXMLByteVectorType&
  XalanTranscodingServices::getStreamProlog(const XalanDOMString&		theEncodingName)
  {
  	if (compareIgnoreCase(c_wstr(theEncodingName), s_UTF16String) == 0)
  	{
  		return s_UTF16Vector;
  	}
  #if 0
  	// We won't do this for now...
  	else if (compareIgnoreCase(c_wstr(theEncodingName), s_UTF8String) == 0)
  	{
  		return s_UTF8Vector;
  	}
  #endif
  	else
  	{
  		return s_dummyVector;
  	}
  }
  
  
  
  XalanOutputTranscoder::XalanOutputTranscoder()
  {
  }
  
  
  
  XalanOutputTranscoder::~XalanOutputTranscoder()
  {
  }
  
  
  
  void
  XalanTranscodingServices::initialize()
  {
  	s_UTF8Vector.reserve(3);
  
  	// These are the characters that comprise the
  	// UTF-8 byte-order mark.
  	s_UTF8Vector.push_back(0xEF);
  	s_UTF8Vector.push_back(0xBB);
  	s_UTF8Vector.push_back(0xBF);
  
  	s_UTF16Vector.reserve(2);
  
  	// The byte order mark varies, since we're writing
  	// UTF-16 out in the platform's endian-ness.
  #if defined(XALAN_LITLE_ENDIAN)
  	s_UTF16Vector.push_back(0xFF);
  	s_UTF16Vector.push_back(0xFE);
  #elif defined(XALAN_BIG_ENDIAN)
  	s_UTF16Vector.push_back(0xFE);
  	s_UTF16Vector.push_back(0xFF);
  #else
  #error The platform must define the byte order!
  #endif
  }
  
  
  
  void
  XalanTranscodingServices::terminate()
  {
  	XalanXMLByteVectorType().swap(s_UTF16Vector);
  	XalanXMLByteVectorType().swap(s_UTF8Vector);
  }
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanTranscodingServices.hpp
  
  Index: XalanTranscodingServices.hpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2000 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  #if !defined(XALANTRANSCODINGSERVICES_HEADER_GUARD_1357924680)
  #define XALANTRANSCODINGSERVICES_HEADER_GUARD_1357924680
  
  
  
  // Base include file.  Must be first.
  #include <PlatformSupport/PlatformSupportDefinitions.hpp>
  
  
  
  #include <vector>
  
  
  
  #include <XalanDOM/XalanDOMString.hpp>
  
  
  
  class XalanOutputTranscoder;
  
  
  
  class XALAN_PLATFORMSUPPORT_EXPORT XalanTranscodingServices
  {
  public:
  
  	typedef unsigned char	XalanXMLByte;
  
  #if defined(XALAN_NO_NAMESPACES)
  	typedef vector<XalanXMLByte>		XalanXMLByteVectorType;
  #else
  	typedef std::vector<XalanXMLByte>	XalanXMLByteVectorType;
  #endif
  
  	/**
  	 * Perform static initialization.  See class PlatformSupportInit.
  	 */
  	static void
  	initialize();
  
  	/**
  	 * Perform static shut down.  See class PlatformSupportInit.
  	 */
  	static void
  	terminate();
  
      enum eCode
      {
  		OK,
  		UnsupportedEncoding,
  		InternalFailure,
  		SupportFilesNotFound
      };
  
  
  	/**
  	 * Create a transcoder instance for the specified encoding.
  	 * 
  	 * @param theEncodingName The name of the desired output encoding.
  	 * @param theResult The error code.
  	 * @param theTarget The target array for storing the transcoded data.
  	 * @param theBlockSize The block size the transcoder should use.
  	 * @return The new transcoder, or 0 if there was an error.
  	 */
  	static XalanOutputTranscoder*
  	makeNewTranscoder(
  			const XalanDOMString&	theEncodingName,
  			eCode&					theResult,
  			unsigned int			theBlockSize);
  
  	/**
  	 * Destroy a transcoder instance.
  	 * 
  	 * @theTranscoder The transcoder to destroy.
  	 */
  	static void
  	destroyTranscoder(XalanOutputTranscoder*	theTranscoder);
  
  	/**
  	 * Determine if the encoding name supplied is equuvalent to UTF-16.
  	 * 
  	 * @param theEncodingName The name of the desired output encoding.
  	 * @return true or false
  	 */
  	static bool
  	encodingIsUTF16(const XalanDOMChar*		theEncodingName);
  
  	/**
  	 * Determine if the encoding name supplied is equuvalent to UTF-16.
  	 * 
  	 * @param theEncodingName The name of the desired output encoding.
  	 * @return true or false
  	 */
  	static bool
  	encodingIsUTF16(const XalanDOMString&	theEncodingName);
  
  	/**
  	 * Get a vector that contains any leading bytes that should be
  	 * written to an XML stream for the specified encoding.  For example,
  	 * if the encoding is UTF-16, the vector will contain the appropriate
  	 * byte order mark for the current platform.  If there is no
  	 * prolog for the encoding, or the encoding is unknown, an empty
  	 * vector is returned.
  	 * 
  	 * @param theEncodingName The name of the desired output encoding.
  	 * @return A reference to a vector containing the appropriate bytes.
  	 */
  	static const XalanXMLByteVectorType&
  	getStreamProlog(const XalanDOMString&	theEncodingName);
  
  private:
  
  	static const XalanDOMChar 	s_UTF8String[];
  	static const XalanDOMChar 	s_UTF16String[];
  };
  
  
  
  class XALAN_PLATFORMSUPPORT_EXPORT XalanOutputTranscoder
  {
  public:
  
  	typedef XalanTranscodingServices::XalanXMLByte	XalanXMLByte;
  	typedef XalanTranscodingServices::eCode			eCode;
  
  	explicit
  	XalanOutputTranscoder();
  
  	virtual
  	~XalanOutputTranscoder();
  
  	/**
  	 * Transcode data from UTF-16 to the transcoder's encoding.  If successfull,
  	 * theResult will be set to OK.  If not, it will be set to one of the other
  	 * codes.
  	 *
  	 * @param theSourceData The source data to transcode
  	 * @param theSourceCount The length of the source data.
  	 * @param theTarget The target array for storing the transcoded data.
  	 * @param theTargetSize The number of characters that can be stored in the target.
  	 * @param theSourceCharsTranscoded The count of the source characters that were transcoded.
  	 * @param theTargetBytesUsed The number of characters stored in the target array
  	 * @return The result code.
  	 */
  	virtual eCode
  	transcode(
  			const XalanDOMChar*		theSourceData,
  			unsigned int			theSourceCount,
  			XalanXMLByte*			theTarget,
  			unsigned int			theTargetSize,
  			unsigned int&			theSourceCharsTranscoded,
  			unsigned int&			theTargetBytesUsed) = 0;
  
  private:
  
  	// Not implemented...
  	XalanOutputTranscoder(const XalanOutputTranscoder&	theSource);
  
  	bool
  	operator==(const XalanOutputTranscoder&	theRHS) const;
  
  	XalanOutputTranscoder&
  	operator=(const XalanOutputTranscoder&	theRHS);
  };
  
  
  
  #endif	// NULLTEXTOUTPUTSTREAM_HEADER_GUARD_1357924680
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanUTF16Transcoder.cpp
  
  Index: XalanUTF16Transcoder.cpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2000 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  #include "XalanUTF16Transcoder.hpp"
  
  
  
  #include <cassert>
  
  
  
  XalanUTF16Transcoder::XalanUTF16Transcoder() :
  	XalanOutputTranscoder()
  {
  }
  
  
  
  XalanUTF16Transcoder::~XalanUTF16Transcoder()
  {
  }
  
  
  
  XalanUTF16Transcoder::eCode
  XalanUTF16Transcoder::transcode(
  			const XalanDOMChar*		theSourceData,
  			unsigned int			theSourceCount,
  			XalanXMLByte*			theTarget,
  			unsigned int			theTargetSize,
  			unsigned int&			theSourceCharsTranscoded,
  			unsigned int&			theTargetBytesUsed)
  {
  	unsigned int	theSourceEaten = 0;
  	unsigned int	theTargetPosition = 0;
  
  	while(theSourceEaten < theSourceCount)
  	{
  		// Swap bytes to big endian...
  		if (theTargetPosition + 1 >= theTargetSize)
  		{
  			break;
  		}
  		else
  		{
  			const XMLByte	theHighByte = XMLByte((theSourceData[theSourceEaten] & 0xFF00) >> 8);
  			const XMLByte	theLowByte = XMLByte(theSourceData[theSourceEaten] & 0x00FF);
  
  #if defined(XALAN_LITLE_ENDIAN)
  			theTarget[theTargetPosition++] = theLowByte;
  			theTarget[theTargetPosition++] = theHighByte;
  #elif defined(XALAN_BIG_ENDIAN)
  			theTarget[theTargetPosition++] = theHighByte;
  			theTarget[theTargetPosition++] = theLowByte;
  #else
  #error The platform must define the byte order!
  #endif
  
  			++theSourceEaten;
  		}
  	}
  
  	theSourceCharsTranscoded = theSourceEaten;
  
  	theTargetBytesUsed = theTargetPosition;
  
  	return XalanTranscodingServices::OK;
  }
  
  
  
  1.1                  xml-xalan/c/src/PlatformSupport/XalanUTF16Transcoder.hpp
  
  Index: XalanUTF16Transcoder.hpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2000 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  #if !defined(XALANUTF16TRANSCODER_HEADER_GUARD_1357924680)
  #define XALANUTF16TRANSCODER_HEADER_GUARD_1357924680
  
  
  
  // Base include file.  Must be first.
  #include <PlatformSupport/PlatformSupportDefinitions.hpp>
  
  
  
  // Base class header file...
  #include <PlatformSupport/XalanTranscodingServices.hpp>
  
  
  
  class XALAN_PLATFORMSUPPORT_EXPORT XalanUTF16Transcoder : public XalanOutputTranscoder
  {
  public:
  
  	explicit
  	XalanUTF16Transcoder();
     
  	virtual
  	~XalanUTF16Transcoder();
  
  	/**
  	 * Transcode data from UTF-16 to UTF-16.  Used for the time being, because, on some
  	 * platforms, we store UTF-16 in 4-byte wchar_t.
  	 *
  	 * @param theSourceData The source data to transcode
  	 * @param theSourceCount The length of the source data.
  	 * @param theResult The error code, if any.
  	 * @param theTarget The target array for storing the transcoded data.
  	 * @param theTargetSize The number of characters that can be stored in the target.
  	 * @param theSourceCharsTranscoded The count of the source characters that were transcoded.
  	 * @param theTargetBytesUsed The number of characters stored in the target array
  	 * @return The result code.
  	 */
  	virtual eCode
  	transcode(
  			const XalanDOMChar*		theSourceData,
  			unsigned int			theSourceCount,
  			XalanXMLByte*			theTarget,
  			unsigned int			theTargetSize,
  			unsigned int&			theSourceCharsTranscoded,
  			unsigned int&			theTargetBytesUsed);
  
  private:
  
  	// Not implemented...
  	XalanUTF16Transcoder(const XalanUTF16Transcoder&);
  
  	XalanUTF16Transcoder&
  	operator=(const XalanUTF16Transcoder&);
  };
  
  
  
  #endif	// XALANUTF16TRANSCODER_HEADER_GUARD_1357924680