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/10/07 17:23:42 UTC

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

dbertoni    00/10/07 08:23:42

  Modified:    c/src/PlatformSupport XalanTranscodingServices.cpp
                        XalanTranscodingServices.hpp
  Log:
  Moved some transcoding-related code to here from FormatterToXML.
  
  Revision  Changes    Path
  1.3       +183 -6    xml-xalan/c/src/PlatformSupport/XalanTranscodingServices.cpp
  
  Index: XalanTranscodingServices.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/XalanTranscodingServices.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XalanTranscodingServices.cpp	2000/10/02 20:52:25	1.2
  +++ XalanTranscodingServices.cpp	2000/10/07 15:23:41	1.3
  @@ -73,11 +73,11 @@
   
   
   
  -const XalanDOMChar 	XalanTranscodingServices::s_UTF8String[] =
  +const XalanDOMChar 	XalanTranscodingServices::s_utf8String[] =
   {
   	XalanUnicode::charLetter_U,
   	XalanUnicode::charLetter_T,
  -	XalanUnicode::charLetter_F, 
  +	XalanUnicode::charLetter_F,
   	XalanUnicode::charHyphenMinus,
   	XalanUnicode::charDigit_8,
   	0
  @@ -85,7 +85,7 @@
   
   
   
  -const XalanDOMChar 	XalanTranscodingServices::s_UTF16String[] =
  +const XalanDOMChar 	XalanTranscodingServices::s_utf16String[] =
   {
   	XalanUnicode::charLetter_U,
   	XalanUnicode::charLetter_T,
  @@ -98,6 +98,51 @@
   
   
   
  +const XalanDOMChar 	XalanTranscodingServices::s_asciiString[] =
  +{
  +	XalanUnicode::charLetter_A,
  +	XalanUnicode::charLetter_S,
  +	XalanUnicode::charLetter_C, 
  +	XalanUnicode::charLetter_I,
  +	XalanUnicode::charLetter_I,
  +	0
  +};
  +
  +
  +
  +const XalanDOMChar 	XalanTranscodingServices::s_usASCIIString[] =
  +{
  +	XalanUnicode::charLetter_U,
  +	XalanUnicode::charLetter_S,
  +	XalanUnicode::charHyphenMinus,
  +	XalanUnicode::charLetter_A,
  +	XalanUnicode::charLetter_S,
  +	XalanUnicode::charLetter_C, 
  +	XalanUnicode::charLetter_I,
  +	XalanUnicode::charLetter_I,
  +	0
  +};
  +
  +
  +
  +const XalanDOMChar 	XalanTranscodingServices::s_windows1250String[] =
  +{
  +	XalanUnicode::charLetter_W,
  +	XalanUnicode::charLetter_I,
  +	XalanUnicode::charLetter_N,
  +	XalanUnicode::charLetter_D,
  +	XalanUnicode::charLetter_O, 
  +	XalanUnicode::charLetter_W,
  +	XalanUnicode::charLetter_S,
  +	XalanUnicode::charHyphenMinus,
  +	XalanUnicode::charDigit_1,
  +	XalanUnicode::charDigit_2,
  +	XalanUnicode::charDigit_5,
  +	XalanUnicode::charDigit_0,
  +};
  +
  +
  +
   static XalanTranscodingServices::eCode
   translateCode(XMLTransService::Codes	theCode)
   {
  @@ -173,9 +218,24 @@
   
   
   bool
  +XalanTranscodingServices::encodingIsUTF8(const XalanDOMChar*	theEncodingName)
  +{
  +	return compareIgnoreCase(c_wstr(theEncodingName), s_utf8String) == 0 ? true : false;
  +}
  +
  +
  +bool
  +XalanTranscodingServices::encodingIsUTF8(const XalanDOMString&		theEncodingName)
  +{
  +	return encodingIsUTF8(c_wstr(theEncodingName));
  +}
  +
  +
  +
  +bool
   XalanTranscodingServices::encodingIsUTF16(const XalanDOMChar*	theEncodingName)
   {
  -	return compareIgnoreCase(c_wstr(theEncodingName), s_UTF16String) == 0 ? true : false;
  +	return compareIgnoreCase(c_wstr(theEncodingName), s_utf16String) == 0 ? true : false;
   }
   
   
  @@ -198,13 +258,13 @@
   const XalanTranscodingServices::XalanXMLByteVectorType&
   XalanTranscodingServices::getStreamProlog(const XalanDOMString&		theEncodingName)
   {
  -	if (compareIgnoreCase(c_wstr(theEncodingName), s_UTF16String) == 0)
  +	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)
  +	else if (compareIgnoreCase(c_wstr(theEncodingName), s_utf8String) == 0)
   	{
   		return s_UTF8Vector;
   	}
  @@ -217,6 +277,65 @@
   
   
   
  +XalanDOMChar
  +XalanTranscodingServices::getMaximumCharacterValue(const XalanDOMString&	theEncoding)
  +{
  +	const MaximumCharacterValueMapType::const_iterator	i =
  +		s_maximumCharacterValues.find(toUpperCase(theEncoding));
  +
  +	if (i == s_maximumCharacterValues.end())
  +	{
  +		return XalanDOMChar(0x7fu);
  +	}
  +	else
  +	{
  +		return (*i).second;
  +	}
  +}
  +
  +
  +
  +XalanDOMChar
  +XalanTranscodingServices::getMaximumCharacterValue()
  +{
  +	// $$$ ToDo: We need to set this according to the local
  +	// code page, but how?  Perhaps try to transcode various
  +	// strings with increasingly larger character values, using
  +	// DOMStringHelper's TranscodeToLocalCodePage()?  Not exactly
  +	// what we need, but it may do.
  +	return XalanDOMChar(0x7fu);
  +}
  +
  +
  +
  +bool
  +XalanTranscodingServices::getBytesEqualChars(const XalanDOMString&	theEncoding)
  +{
  +	return equals(theEncoding, s_asciiString) ||
  +		   equals(theEncoding, s_usASCIIString) ||
  +		   equals(theEncoding, s_windows1250String);
  +}
  +
  +
  +
  +XalanTranscodingServices::UnrepresentableCharacterException::UnrepresentableCharacterException(
  +			XalanDOMChar			theCharacter,
  +			const XalanDOMString&	theEncoding) :
  +	XSLException(XalanDOMString("Unable to represent a character in the specified encoding"),
  +				 XalanDOMString("UnrepresentableCharacterException")),
  +	m_badCharacter(theCharacter),
  +	m_encoding(theEncoding)
  +{
  +}
  +
  +
  +
  +XalanTranscodingServices::UnrepresentableCharacterException::~UnrepresentableCharacterException()
  +{
  +}
  +
  +
  +
   XalanOutputTranscoder::XalanOutputTranscoder()
   {
   }
  @@ -229,6 +348,60 @@
   
   
   
  +static XalanTranscodingServices::MaximumCharacterValueMapType	s_maximumCharacterValues;
  +
  +const XalanTranscodingServices::MaximumCharacterValueMapType&	XalanTranscodingServices::s_maximumCharacterValues =
  +			::s_maximumCharacterValues;
  +
  +
  +
  +static void
  +initMaximumCharacterValueMap(XalanTranscodingServices::MaximumCharacterValueMapType&	theMap)
  +{
  +	typedef XalanTranscodingServices::MaximumCharacterValueMapType::value_type	value_type;
  +
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("WINDOWS-1250")),	 0xFF)); // Windows 1250 Peter Smolik
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("UTF-8")),			 0xFFFF)); // Universal Transformation Format 8
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("US-ASCII")),		 0x7F));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-1")), 	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-2")), 	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-3")), 	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-4")), 	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-5")), 	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-6")), 	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-7")), 	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-8")), 	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-9")), 	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-JP")),	 0xFFFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("SHIFT_JIS")),		 0xFFFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EUC-JP")), 		 0xFFFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("GB2312")), 		 0xFFFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("BIG5")),			 0xFFFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EUC-KR")), 		 0xFFFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-KR")),	 0xFFFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("KOI8-R")), 		 0xFFFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-US")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CA")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NL")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-DK")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NO")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FI")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-SE")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IT")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ES")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-GB")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FR")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR1")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-HE")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CH")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ROECE")), 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-YU")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IS")),	 0xFF));
  +	theMap.insert(value_type(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR2")),	 0xFF));
  +}
  +
  +
  +
   void
   XalanTranscodingServices::initialize()
   {
  @@ -253,6 +426,8 @@
   #else
   #error The platform must define the byte order!
   #endif
  +
  +	initMaximumCharacterValueMap(::s_maximumCharacterValues);
   }
   
   
  @@ -262,4 +437,6 @@
   {
   	XalanXMLByteVectorType().swap(s_UTF16Vector);
   	XalanXMLByteVectorType().swap(s_UTF8Vector);
  +
  +	MaximumCharacterValueMapType().swap(::s_maximumCharacterValues);
   }
  
  
  
  1.2       +98 -4     xml-xalan/c/src/PlatformSupport/XalanTranscodingServices.hpp
  
  Index: XalanTranscodingServices.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/XalanTranscodingServices.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XalanTranscodingServices.hpp	2000/09/27 16:24:12	1.1
  +++ XalanTranscodingServices.hpp	2000/10/07 15:23:41	1.2
  @@ -64,6 +64,7 @@
   
   
   
  +#include <map>
   #include <vector>
   
   
  @@ -72,6 +73,10 @@
   
   
   
  +#include <PlatformSupport/XSLException.hpp>
  +
  +
  +
   class XalanOutputTranscoder;
   
   
  @@ -83,8 +88,13 @@
   	typedef unsigned char	XalanXMLByte;
   
   #if defined(XALAN_NO_NAMESPACES)
  +	typedef map<XalanDOMString,
  +				XalanDOMChar,
  +				less<XalanDOMString> >	MaximumCharacterValueMapType;
   	typedef vector<XalanXMLByte>		XalanXMLByteVectorType;
   #else
  +	typedef std::map<XalanDOMString,
  +					 XalanDOMChar>		MaximumCharacterValueMapType;
   	typedef std::vector<XalanXMLByte>	XalanXMLByteVectorType;
   #endif
   
  @@ -132,17 +142,35 @@
   	static void
   	destroyTranscoder(XalanOutputTranscoder*	theTranscoder);
   
  +	/**
  +	 * Determine if the encoding name supplied is equivalent to UTF-8.
  +	 * 
  +	 * @param theEncodingName The name of the desired output encoding.
  +	 * @return true or false
  +	 */
  +	static bool
  +	encodingIsUTF8(const XalanDOMChar*		theEncodingName);
  +
   	/**
  -	 * Determine if the encoding name supplied is equuvalent to UTF-16.
  +	 * Determine if the encoding name supplied is equivalent to UTF-8.
   	 * 
   	 * @param theEncodingName The name of the desired output encoding.
   	 * @return true or false
   	 */
   	static bool
  +	encodingIsUTF8(const XalanDOMString&	theEncodingName);
  +
  +	/**
  +	 * Determine if the encoding name supplied is equivalent 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.
  +	 * Determine if the encoding name supplied is equivalent to UTF-16.
   	 * 
   	 * @param theEncodingName The name of the desired output encoding.
   	 * @return true or false
  @@ -164,10 +192,76 @@
   	static const XalanXMLByteVectorType&
   	getStreamProlog(const XalanDOMString&	theEncodingName);
   
  +	/**
  +	 * Get the maximum character value for the encoding.
  +	 *
  +	 * @param theEncoding The encoding name.
  +	 * @return The maximum character value the encoding supports.
  +	 */
  +	static XalanDOMChar
  +	getMaximumCharacterValue(const XalanDOMString&	theEncoding);
  +
  +	/**
  +	 * Get the maximum character value for the local code page.
  +	 *
  +	 * @return The maximum character value the local code page supports.
  +	 */
  +	static XalanDOMChar
  +	getMaximumCharacterValue();
  +
  +	/**
  +	 * Determine if the output stage can safely skip transcoding
  +	 * by truncating.
  +	 *
  +	 * @param theEncoding The encoding name.
  +	 * @return true if truncation is possible, false if not.
  +	 */
  +	static bool
  +	getBytesEqualChars(const XalanDOMString&	theEncoding);
  +
  +	static const XalanDOMChar 	s_utf8String[];
  +
  +	static const XalanDOMChar 	s_utf16String[];
  +
  +	static const XalanDOMChar 	s_asciiString[];
  +
  +	static const XalanDOMChar 	s_usASCIIString[];
  +
  +	static const XalanDOMChar 	s_windows1250String[];
  +
  +	class XALAN_PLATFORMSUPPORT_EXPORT UnrepresentableCharacterException : public XSLException
  +	{
  +	public:
  +
  +		UnrepresentableCharacterException(
  +			XalanDOMChar			theCharacter,
  +			const XalanDOMString&	theEncoding);
  +
  +		virtual
  +		~UnrepresentableCharacterException();
  +
  +		XalanDOMChar
  +		getCharacter() const
  +		{
  +			return m_badCharacter;
  +		}
  +
  +		const XalanDOMString&
  +		getEncoding() const
  +		{
  +			return m_encoding;
  +		}
  +
  +	private:
  +
  +		const XalanDOMChar		m_badCharacter;
  +
  +		const XalanDOMString	m_encoding;
  +	};
  +
   private:
   
  -	static const XalanDOMChar 	s_UTF8String[];
  -	static const XalanDOMChar 	s_UTF16String[];
  +	static const MaximumCharacterValueMapType&	s_maximumCharacterValues;
   };