You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by dm...@apache.org on 2005/08/04 20:01:40 UTC

cvs commit: xml-xalan/c/src/xalanc/XMLSupport FormatterToXMLUnicode.hpp XalanFormatterWriter.hpp XalanXMLSerializerBase.cpp XalanXMLSerializerBase.hpp XalanXMLSerializerFactory.cpp

dmitryh     2005/08/04 11:01:40

  Modified:    c/src/xalanc/NLS/en_US XalanMsg_en_US.xlf
               c/src/xalanc/XMLSupport FormatterToXMLUnicode.hpp
                        XalanFormatterWriter.hpp XalanXMLSerializerBase.cpp
                        XalanXMLSerializerBase.hpp
                        XalanXMLSerializerFactory.cpp
  Log:
  Fix for XALANC-532
  
  Revision  Changes    Path
  1.20      +6 -0      xml-xalan/c/src/xalanc/NLS/en_US/XalanMsg_en_US.xlf
  
  Index: XalanMsg_en_US.xlf
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/NLS/en_US/XalanMsg_en_US.xlf,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- XalanMsg_en_US.xlf	2 May 2005 19:33:48 -0000	1.19
  +++ XalanMsg_en_US.xlf	4 Aug 2005 18:01:40 -0000	1.20
  @@ -960,6 +960,12 @@
   		<target>Expected a token but reached the end of the expression instead.</target>
   </trans-unit>
   
  +<trans-unit id="ForbiddenXMLCharacter_2Param">
  +		<source>The Unicode code point '{0}' is not a legal XML {1} character.</source>
  +		<target>The Unicode code point '{0}' is not a legal XML {1} character.</target>
  +</trans-unit>
  +
  +
       </body>
     </file>
   </xliff>
  
  
  
  1.7       +65 -62    xml-xalan/c/src/xalanc/XMLSupport/FormatterToXMLUnicode.hpp
  
  Index: FormatterToXMLUnicode.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XMLSupport/FormatterToXMLUnicode.hpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- FormatterToXMLUnicode.hpp	30 Jun 2005 21:52:35 -0000	1.6
  +++ FormatterToXMLUnicode.hpp	4 Aug 2005 18:01:40 -0000	1.7
  @@ -49,10 +49,8 @@
   template<
       class                           UnicodeWriter,
       class                           ConstantsType,
  -    class                           AttributePredicate,
  -    class                           ContentPredicate,
  -    class                           OutsideRangePredicate,
  -    class                           IndentHandeler,
  +    class                           CharPredicate,
  +    class                           IndentHandler,
       FormatterListener::eXMLVersion  XMLVersion>
   class XALAN_XMLSUPPORT_EXPORT FormatterToXMLUnicode : public XalanXMLSerializerBase
   {
  @@ -101,9 +99,7 @@
           m_stringBuffer(theManager),
           m_writer(writer, theManager),
           m_constants(),
  -        m_attributePredicate(),
  -        m_contentPredicate(),
  -        m_outsideRangePredicate(),
  +        m_charPredicate(),
           m_indentHandler(m_writer , indent)
       {
       }
  @@ -430,7 +426,7 @@
           {
               const XalanDOMChar  ch = chars[i];
   
  -            if(m_outsideRangePredicate(ch) == true)
  +            if(m_charPredicate.range(ch) == true)
               {
                   safeWriteContent(chars + firstIndex, i - firstIndex);
   
  @@ -440,7 +436,7 @@
   
                   firstIndex = i;
               }
  -            else if(m_contentPredicate(ch) == false)
  +            else if(m_charPredicate.content(ch) == false)
               {
                   ++i;
               }
  @@ -501,15 +497,27 @@
       void
       writeDefaultEscape(XalanDOMChar     ch)
       {
  +        assert(m_charPredicate.content(ch) == true);
  +
           if(!writeDefaultEntity(ch))
           {
               if (XalanUnicode::charLF == ch)
               {
                   outputNewline();
               }
  -            else if (XMLVersion == XML_VERSION_1_1)
  +            else
               {
  -                writeXML1_1CharacterReference(ch);
  +                if(m_charPredicate.isForbidden(ch) == true)
  +                {
  +                    XalanXMLSerializerBase::throwInvalidXMLCharacterException(
  +                                                            ch,
  +                                                            m_version,
  +                                                            getMemoryManager());
  +                }
  +                else
  +                {
  +                    writeNumericCharacterReference(ch);
  +                }
               }
           }
       }
  @@ -520,10 +528,22 @@
       void
       writeDefaultAttributeEscape(XalanDOMChar    ch)
       {
  -        if(writeDefaultAttributeEntity(ch) == false &&
  -           XMLVersion == XML_VERSION_1_1)
  +        assert(m_charPredicate.attribute(ch) == true);
  +
  +        if(writeDefaultAttributeEntity(ch) == false)
           {
  -           writeXML1_1CharacterReference(ch);
  +            if(m_charPredicate.isForbidden(ch) == true)
  +            {
  +                XalanXMLSerializerBase::throwInvalidXMLCharacterException(
  +                                                            ch,
  +                                                            m_version,
  +                                                            getMemoryManager());
  +            }
  +            else
  +            {
  +                writeNumericCharacterReference(ch);
  +            }
  +           
           }
       }
       
  @@ -571,30 +591,12 @@
           {
               return true;
           }
  -        else if (XalanUnicode::charLF == ch) 
  -        {
  -            m_writer.write(
  -                m_constants.s_linefeedNCRString,
  -                m_constants.s_linefeedNCRStringLength);
  -        }
  -        else if (XalanUnicode::charCR == ch) 
  -        {
  -            m_writer.write(
  -                m_constants.s_carriageReturnNCRString,
  -                m_constants.s_carriageReturnNCRStringLength);
  -        }
           else if (XalanUnicode::charQuoteMark == ch) 
           {
               m_writer.write(
                   m_constants.s_quoteEntityString,
                   m_constants.s_quoteEntityStringLength);
           }
  -        else if (XalanUnicode::charHTab == ch) 
  -        {
  -            m_writer.write(
  -                m_constants.s_htabNCRString,
  -                m_constants.s_htabNCRStringLength);
  -        }
           else
           {
               return false;
  @@ -640,14 +642,23 @@
           }
           else 
           {
  -            start = m_writer.write( chars, start, length);
  +            if(m_charPredicate.isCharRefForbidden(ch))
  +            {
  +                XalanXMLSerializerBase::throwInvalidXMLCharacterException(
  +                                                            ch,
  +                                                            m_version,
  +                                                            getMemoryManager());            }
  +            else
  +            {
  +                start = m_writer.write( chars, start, length);
  +            }
           }
   
           return start;
       }
   
       void
  -    writeNumberedEntityReference(unsigned long  theNumber)
  +    writeNumericCharacterReference(unsigned long  theNumber)
       {
           m_writer.write(value_type(XalanUnicode::charAmpersand));
           m_writer.write(value_type(XalanUnicode::charNumberSign));
  @@ -666,13 +677,14 @@
       {
           assert( start < length);
   
  -        XalanDOMChar ch = chars[start];
  +        const XalanDOMChar  ch = chars[start];
   
  -        assert(m_outsideRangePredicate(ch) == true);
  +        assert(m_charPredicate.range(ch) == true);
   
  -        if (XalanUnicode::charLSEP == ch)
  +        if (XMLVersion == XML_VERSION_1_1 &&
  +            XalanUnicode::charLSEP == ch)
           {
  -            writeNumberedEntityReference(ch);
  +            writeNumericCharacterReference(ch);
           }
           else 
           {
  @@ -682,19 +694,6 @@
           return start;
       }
   
  -    void
  -    writeXML1_1CharacterReference(XalanDOMChar    theChar)
  -    {
  -        assert(XMLVersion == XML_VERSION_1_1);
  -        assert(m_outsideRangePredicate(theChar) == false);
  -
  -        if(theChar < XalanUnicode::charSpace ||
  -           theChar <= 0x97 && theChar >= 0x80)
  -        {
  -            writeNumberedEntityReference(theChar);
  -        }
  -    }
  -
       /**
        * Write characters for a CDATA section
        *
  @@ -747,8 +746,17 @@
                   {
                       outputNewline();
                   }
  -
  -                i = m_writer.writeCDATAChar(chars, i, length, (int&)theCurrentState);
  +                if(m_charPredicate.isCharRefForbidden(theChar))
  +                {
  +                     XalanXMLSerializerBase::throwInvalidXMLCharacterException(
  +                                                            theChar,
  +                                                            m_version,
  +                                                            getMemoryManager());                }
  +                else
  +                {
  +                    i = m_writer.writeCDATAChar(chars, i, length, (int&)theCurrentState);
  +                }
  +                
               }
   
               ++i;
  @@ -783,7 +791,7 @@
           {
               const XalanDOMChar  ch = theString[i];
   
  -            if(m_outsideRangePredicate(ch) == true)
  +            if(m_charPredicate.range(ch) == true)
               {
                   safeWriteContent(theString + firstIndex, i - firstIndex);
   
  @@ -793,7 +801,7 @@
   
                   firstIndex = i;
               }
  -            else if (m_attributePredicate(ch) == false)
  +            else if (m_charPredicate.attribute(ch) == false)
               {
                   ++i;
               }
  @@ -814,7 +822,6 @@
   
   private:
   
  -
       /**
        * Process an attribute.
        * @param name The name of the attribute.
  @@ -889,13 +896,9 @@
   
       ConstantsType           m_constants;
   
  -    AttributePredicate      m_attributePredicate;
  -
  -    ContentPredicate        m_contentPredicate;
  -
  -    OutsideRangePredicate   m_outsideRangePredicate;
  +    CharPredicate           m_charPredicate;
   
  -    IndentHandeler           m_indentHandler;
  +    IndentHandler           m_indentHandler;
   };
   
   
  
  
  
  1.6       +2 -2      xml-xalan/c/src/xalanc/XMLSupport/XalanFormatterWriter.hpp
  
  Index: XalanFormatterWriter.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XMLSupport/XalanFormatterWriter.hpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XalanFormatterWriter.hpp	9 Jun 2005 20:27:19 -0000	1.5
  +++ XalanFormatterWriter.hpp	4 Aug 2005 18:01:40 -0000	1.6
  @@ -116,11 +116,11 @@
           WriterType& m_writer;
       };
   
  -    class CommonPresentableCharFunctor
  +    class CommonRepresentableCharFunctor
       {
       public:
   
  -        CommonPresentableCharFunctor(const XalanOutputStream* stream) :
  +        CommonRepresentableCharFunctor(const XalanOutputStream* stream) :
               m_stream(stream)
           {
               assert( stream != 0 );
  
  
  
  1.4       +35 -97    xml-xalan/c/src/xalanc/XMLSupport/XalanXMLSerializerBase.cpp
  
  Index: XalanXMLSerializerBase.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XMLSupport/XalanXMLSerializerBase.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XalanXMLSerializerBase.cpp	10 Jun 2005 20:28:10 -0000	1.3
  +++ XalanXMLSerializerBase.cpp	4 Aug 2005 18:01:40 -0000	1.4
  @@ -33,14 +33,14 @@
   
   XALAN_CPP_NAMESPACE_BEGIN
   
  +const size_t  XalanXMLSerializerBase::CharFunctor1_0::s_lastSpecial = 0x7fu;
   
  -
  -const char  XalanXMLSerializerBase::s_specialChars1_0[eSpecialsSize] =
  +const char  XalanXMLSerializerBase::CharFunctor1_0::s_specialChars[s_lastSpecial + 1] =
   {
  - /* 00-07 */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
  - /* 08-0F */    eNone,  eAttr,  eBoth,  eNone,  eNone,  eAttr,  eNone,  eNone,
  - /* 10-17 */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
  - /* 18-1F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
  + /* 00-07 */    eForb,  eForb,  eForb,  eForb,  eForb,  eForb,  eForb,  eForb,
  + /* 08-0F */    eForb,  eAttr,  eBoth,  eForb,  eForb,  eBoth,  eForb,  eForb,
  + /* 10-17 */    eForb,  eForb,  eForb,  eForb,  eForb,  eForb,  eForb,  eForb,
  + /* 18-1F */    eForb,  eForb,  eForb,  eForb,  eForb,  eForb,  eForb,  eForb,
    /* 20-27 */    eNone,  eNone,  eAttr,  eNone,  eNone,  eNone,  eBoth,  eNone,
    /* 28-2F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
    /* 30-37 */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
  @@ -52,19 +52,18 @@
    /* 60-67 */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
    /* 68-6F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
    /* 70-77 */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
  - /* 78-7F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
  - /* 88-8F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
  - /* 90-96 */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone
  + /* 78-7F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone
   };
   
   
  +const size_t  XalanXMLSerializerBase::CharFunctor1_1::s_lastSpecial = 0x9fu;
   
  -const char  XalanXMLSerializerBase::s_specialChars1_1[eSpecialsSize] =
  +const char  XalanXMLSerializerBase::CharFunctor1_1::s_specialChars[s_lastSpecial + 1] =
   {
  - /* 00-07 */    eNone,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,
  - /* 08-0F */    eBoth,  eAttr,  eBoth,  eBoth,  eBoth,  eAttr,  eBoth,  eBoth,
  - /* 10-17 */    eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,
  - /* 18-1F */    eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,
  + /* 00-07 */    eNone,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,
  + /* 08-0F */    eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,
  + /* 10-17 */    eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,
  + /* 18-1F */    eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,
    /* 20-27 */    eNone,  eNone,  eAttr,  eNone,  eNone,  eNone,  eBoth,  eNone,
    /* 28-2F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
    /* 30-37 */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
  @@ -76,14 +75,14 @@
    /* 60-67 */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
    /* 68-6F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
    /* 70-77 */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
  - /* 78-7F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
  - /* 80-87 */    eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,
  - /* 88-8F */    eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,
  - /* 90-96 */    eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth,  eBoth
  + /* 78-7F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eCRFb,
  + /* 80-87 */    eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eBoth,  eCRFb,  eCRFb,
  + /* 88-8F */    eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,
  + /* 90-97 */    eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,
  + /* 98-9F */    eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb,  eCRFb
   };
   
   
  -
   XalanXMLSerializerBase::XalanXMLSerializerBase(
               MemoryManager&              theManager,
               eXMLVersion                 theXMLVersion,
  @@ -207,6 +206,23 @@
       throw SAXException(theMessage.c_str(), &theManager);
   }
   
  +void
  +XalanXMLSerializerBase::throwInvalidXMLCharacterException(
  +                                  unsigned int                ch,
  +                                  const XalanDOMString&       theXMLversion,
  +                                  MemoryManager&              theManager)
  +{
  +    XalanDOMString  theMessage(theManager);
  +    XalanDOMString  theBuffer(theManager);  
  +
  +    XalanMessageLoader::getMessage(
  +        theMessage,
  +        XalanMessages::ForbiddenXMLCharacter_2Param,
  +        UnsignedLongToHexDOMString(ch, theBuffer),
  +        theXMLversion);
  +
  +    throw SAXException(theMessage.c_str(), &theManager);
  +}
   
   
   void
  @@ -693,46 +709,6 @@
   const XalanDOMString::size_type     XalanXMLSerializerBase::UTF8::s_quoteEntityStringLength =
           FXML_SIZE(s_quoteEntityString);
   
  -const char  XalanXMLSerializerBase::UTF8::s_linefeedNCRString[] =
  -{
  -    char(XalanUnicode::charAmpersand),
  -    char(XalanUnicode::charNumberSign),
  -    char(XalanUnicode::charDigit_1),
  -    char(XalanUnicode::charDigit_0),
  -    char(XalanUnicode::charSemicolon),
  -    char(0)
  -};
  -
  -const XalanDOMString::size_type     XalanXMLSerializerBase::UTF8::s_linefeedNCRStringLength =
  -        FXML_SIZE(s_linefeedNCRString);
  -
  -const char  XalanXMLSerializerBase::UTF8::s_carriageReturnNCRString[] =
  -{
  -    char(XalanUnicode::charAmpersand),
  -    char(XalanUnicode::charNumberSign),
  -    char(XalanUnicode::charDigit_1),
  -    char(XalanUnicode::charDigit_3),
  -    char(XalanUnicode::charSemicolon),
  -    char(0)
  -};
  -
  -const XalanDOMString::size_type     XalanXMLSerializerBase::UTF8::s_carriageReturnNCRStringLength =
  -        FXML_SIZE(s_carriageReturnNCRString);
  -
  -const char  XalanXMLSerializerBase::UTF8::s_htabNCRString[] =
  -{
  -    char(XalanUnicode::charAmpersand),
  -    char(XalanUnicode::charNumberSign),
  -    char(XalanUnicode::charDigit_9),
  -    char(XalanUnicode::charSemicolon),
  -    char(0)
  -};
  -
  -const XalanDOMString::size_type     XalanXMLSerializerBase::UTF8::s_htabNCRStringLength =
  -        FXML_SIZE(s_htabNCRString);
  -
  -
  -
   const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_doctypeHeaderStartString[] =
   {
       XalanUnicode::charLessThanSign,
  @@ -977,44 +953,6 @@
   const XalanDOMString::size_type     XalanXMLSerializerBase::UTF16::s_quoteEntityStringLength =
           FXML_SIZE(s_quoteEntityString);
   
  -const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_linefeedNCRString[] =
  -{
  -    XalanUnicode::charAmpersand,
  -    XalanUnicode::charNumberSign,
  -    XalanUnicode::charDigit_1,
  -    XalanUnicode::charDigit_0,
  -    XalanUnicode::charSemicolon,
  -    XalanDOMChar(0)
  -};
  -
  -const XalanDOMString::size_type     XalanXMLSerializerBase::UTF16::s_linefeedNCRStringLength =
  -        FXML_SIZE(s_linefeedNCRString);
  -
  -const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_carriageReturnNCRString[] =
  -{
  -    XalanUnicode::charAmpersand,
  -    XalanUnicode::charNumberSign,
  -    XalanUnicode::charDigit_1,
  -    XalanUnicode::charDigit_3,
  -    XalanUnicode::charSemicolon,
  -    XalanDOMChar(0)
  -};
  -
  -const XalanDOMString::size_type     XalanXMLSerializerBase::UTF16::s_carriageReturnNCRStringLength =
  -        FXML_SIZE(s_carriageReturnNCRString);
  -
  -const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_htabNCRString[] =
  -{
  -    XalanUnicode::charAmpersand,
  -    XalanUnicode::charNumberSign,
  -    XalanUnicode::charDigit_9,
  -    XalanUnicode::charSemicolon,
  -    XalanDOMChar(0)
  -};
  -
  -const XalanDOMString::size_type     XalanXMLSerializerBase::UTF16::s_htabNCRStringLength =
  -        FXML_SIZE(s_htabNCRString);
  -
   
   
   XALAN_CPP_NAMESPACE_END
  
  
  
  1.3       +89 -77    xml-xalan/c/src/xalanc/XMLSupport/XalanXMLSerializerBase.hpp
  
  Index: XalanXMLSerializerBase.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XMLSupport/XalanXMLSerializerBase.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XalanXMLSerializerBase.hpp	6 Jun 2005 01:32:45 -0000	1.2
  +++ XalanXMLSerializerBase.hpp	4 Aug 2005 18:01:40 -0000	1.3
  @@ -308,27 +308,6 @@
           static const char                       s_quoteEntityString[];
   
           static const XalanDOMString::size_type  s_quoteEntityStringLength;
  -
  -        /**
  -         * The string "&#10;".
  -         */
  -        static const char                       s_linefeedNCRString[];
  -
  -        static const XalanDOMString::size_type  s_linefeedNCRStringLength;
  -
  -        /**
  -         * The string "&#13;".
  -         */
  -        static const char                       s_carriageReturnNCRString[];
  -
  -        static const XalanDOMString::size_type  s_carriageReturnNCRStringLength;
  -
  -        /**
  -         * The string "&#9;".
  -         */
  -        static const char                       s_htabNCRString[];
  -
  -        static const XalanDOMString::size_type  s_htabNCRStringLength;
       };
   
       class XALAN_XMLSUPPORT_EXPORT UTF16
  @@ -444,27 +423,6 @@
           static const XalanDOMChar               s_quoteEntityString[];
   
           static const XalanDOMString::size_type  s_quoteEntityStringLength;
  -
  -        /**
  -         * The string "&#10;".
  -         */
  -        static const XalanDOMChar               s_linefeedNCRString[];
  -
  -        static const XalanDOMString::size_type  s_linefeedNCRStringLength;
  -
  -        /**
  -         * The string "&#13;".
  -         */
  -        static const XalanDOMChar               s_carriageReturnNCRString[];
  -
  -        static const XalanDOMString::size_type  s_carriageReturnNCRStringLength;
  -
  -        /**
  -         * The string "&#9;".
  -         */
  -        static const XalanDOMChar               s_htabNCRString[];
  -
  -        static const XalanDOMString::size_type  s_htabNCRStringLength;
       };
   
       enum
  @@ -472,83 +430,125 @@
           eBufferSize = 512       // The size of the buffer
       };
   
  -    class XALAN_XMLSUPPORT_EXPORT AttributeFunctor1_0
  +    class XALAN_XMLSUPPORT_EXPORT CharFunctor1_0 
       {
       public:
   
           bool
  -        operator()(XalanDOMChar  theChar) const
  +        attribute(XalanDOMChar  theChar) const
           {
  -            return theChar >= eSpecialsSize ?
  +            return theChar > s_lastSpecial ?
                           false :
  -                        s_specialChars1_0[theChar] > eNone;
  +                        s_specialChars[theChar] > eNone;
           }
  -    };
  -
  -    class XALAN_XMLSUPPORT_EXPORT AttributeFunctor1_1
  -    {
  -    public:
   
           bool
  -        operator()(XalanDOMChar  theChar) const
  +        content(XalanDOMChar  theChar) const
           {
  -            return theChar >= eSpecialsSize ?
  +            return theChar > s_lastSpecial ?
                           false :
  -                        s_specialChars1_1[theChar] > eNone;
  +                        s_specialChars[theChar] > eAttr;
           }
  -    };
   
  -    class XALAN_XMLSUPPORT_EXPORT ContentFunctor1_0
  -    {
  -    public:
  +        bool
  +        range(XalanDOMChar  theChar) const
  +        {
  +            assert(theChar > 0);
  +
  +            return theChar > s_lastSpecial;
  +        }
   
           bool
  -        operator()(XalanDOMChar  theChar) const
  +        isForbidden(XalanDOMChar  theChar) const
           {
  -            return theChar >= eSpecialsSize ?
  +            return theChar > s_lastSpecial ?
                           false :
  -                        s_specialChars1_0[theChar] > eAttr;
  +                        s_specialChars[theChar] == eForb;
           }
  +
  +        bool
  +        isCharRefForbidden(XalanDOMChar  theChar) const
  +        {
  +            return theChar > s_lastSpecial ?
  +                        false :
  +                        s_specialChars[theChar] == eForb;
  +        }
  + 
  +
  +    private:
  +         static const size_t    s_lastSpecial;
  +
  +         static const char      s_specialChars[];
       };
   
  -    class XALAN_XMLSUPPORT_EXPORT ContentFunctor1_1
  +
  +
  +    class XALAN_XMLSUPPORT_EXPORT CharFunctor1_1
       {
       public:
   
           bool
  -        operator()(XalanDOMChar  theChar) const
  +        attribute(XalanDOMChar  theChar) const
           {
  -            return theChar >= eSpecialsSize ?
  +            return theChar > s_lastSpecial ?
                           false :
  -                        s_specialChars1_1[theChar] > eAttr;
  +                        s_specialChars[theChar] > eNone;
           }
  -    };
   
  -    class XALAN_XMLSUPPORT_EXPORT RangeFunctor
  -    {
  -    public:
  +        bool
  +        content(XalanDOMChar  theChar) const
  +        {
  +            return theChar > s_lastSpecial ?
  +                        false :
  +                        s_specialChars[theChar] > eAttr;
  +        }
   
           bool
  -        operator()(XalanDOMChar  theChar) const
  +        range(XalanDOMChar  theChar) const
           {
               assert(theChar > 0);
   
  -            return theChar > eLastSpecial;
  +            return theChar > s_lastSpecial;
  +        }
  +
  +        bool
  +        isForbidden(XalanDOMChar  theChar) const
  +        {
  +            return theChar > s_lastSpecial ?
  +                        false :
  +                        s_specialChars[theChar] == eForb;
           }
  +
  +        bool
  +        isCharRefForbidden(XalanDOMChar  theChar) const
  +        {
  +            return theChar > s_lastSpecial ?
  +                        false :
  +                        s_specialChars[theChar] == eCRFb;
  +        }
  +
  +    private:
  +        static const size_t     s_lastSpecial;
  +
  +        static const char       s_specialChars[];
  +
       };
   
  +  
  +
  +
       enum
       {
           eNone = 0u,
           eAttr = 1u,  // A flag to indicate a value in s_specialChars applies to attributes
  -        eBoth = 2u,  // A flag t0 indicate a value in s_specialChars applies to both content and attributes
  -        eSpecialsSize = 256u,   // The size of s_specialChars
  -        eLastSpecial = 0x96u
  +        eBoth = 2u,  // A flag to indicate a value in s_specialChars applies to both content and attributes
  +        eForb = 4u,  // A flag to indicate a forbidden value in s_specialChars 
  +                     // XML1.1 put a requirement to output chars #x1...#x1F and #x7F...#x9F as charRefs only
  +                     // In the comments , PI and CDATA usage of charRefs is forbidden, so we will report an error in 
  +        eCRFb = 5u   // that case. For the elemets and attributes is should work the same as eBoth
       };
  + 
   
  -    static const char   s_specialChars1_0[];
  -
  -    static const char   s_specialChars1_1[];
   
   protected:
   
  @@ -735,6 +735,18 @@
               unsigned int    ch,
               MemoryManager&  theManager);
   
  +
  +    /**
  +     * Throw an exception when an invalid
  +     * character for the specific XML version is encountered.
  +     * @param ch The first character in the surrogate
  +     * @param next The next character in the surrogate
  +     */
  +    static void
  +    throwInvalidXMLCharacterException(
  +            unsigned int                ch,
  +            const XalanDOMString&       theXMLversion,
  +            MemoryManager&              theManager);
   private:
   
       // These are not implemented.
  
  
  
  1.3       +29 -53    xml-xalan/c/src/xalanc/XMLSupport/XalanXMLSerializerFactory.cpp
  
  Index: XalanXMLSerializerFactory.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XMLSupport/XalanXMLSerializerFactory.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XalanXMLSerializerFactory.cpp	6 Jun 2005 01:32:45 -0000	1.2
  +++ XalanXMLSerializerFactory.cpp	4 Aug 2005 18:01:40 -0000	1.3
  @@ -74,15 +74,13 @@
                   typedef XalanFormatterWriter::NewLineWriterFunctor<XalanUTF8Writer> NewLineWriter;
                   typedef XalanFormatterWriter::WhiteSpaceWriterFunctor<XalanUTF8Writer> WhiteSpaceWriter;
   
  -                typedef XalanIndentWriter<WhiteSpaceWriter,NewLineWriter> IdentWriter;
  +                typedef XalanIndentWriter<WhiteSpaceWriter,NewLineWriter> IndentWriter;
   
                   typedef FormatterToXMLUnicode<
                       XalanUTF8Writer,
                       XalanXMLSerializerBase::UTF8,
  -                    XalanXMLSerializerBase::AttributeFunctor1_1,
  -                    XalanXMLSerializerBase::ContentFunctor1_1,
  -                    XalanXMLSerializerBase::RangeFunctor,
  -                    IdentWriter,
  +                    XalanXMLSerializerBase::CharFunctor1_1,
  +                    IndentWriter,
                       FormatterListener::XML_VERSION_1_1>  Type;
   
                   theFormatter =
  @@ -98,15 +96,13 @@
               }
               else // doIndent == false
               {      
  -                typedef XalanDummyIndentWriter<XalanUTF8Writer> IdentWriter;
  +                typedef XalanDummyIndentWriter<XalanUTF8Writer> IndentWriter;
   
                   typedef FormatterToXMLUnicode<
                       XalanUTF8Writer,
                       XalanXMLSerializerBase::UTF8,
  -                    XalanXMLSerializerBase::AttributeFunctor1_1,
  -                    XalanXMLSerializerBase::ContentFunctor1_1,
  -                    XalanXMLSerializerBase::RangeFunctor,
  -                    IdentWriter,
  +                    XalanXMLSerializerBase::CharFunctor1_1,
  +                    IndentWriter,
                       FormatterListener::XML_VERSION_1_1>  Type;
   
                   theFormatter =
  @@ -129,16 +125,14 @@
                   typedef XalanFormatterWriter::NewLineWriterFunctor<XalanUTF8Writer> NewLineWriter;
                   typedef XalanFormatterWriter::WhiteSpaceWriterFunctor<XalanUTF8Writer> WhiteSpaceWriter;
   
  -                typedef XalanIndentWriter<WhiteSpaceWriter,NewLineWriter> IdentWriter;
  +                typedef XalanIndentWriter<WhiteSpaceWriter,NewLineWriter> IndentWriter;
   
   
                   typedef FormatterToXMLUnicode<
                       XalanUTF8Writer,
                       XalanXMLSerializerBase::UTF8,
  -                    XalanXMLSerializerBase::AttributeFunctor1_0,
  -                    XalanXMLSerializerBase::ContentFunctor1_0,
  -                    XalanXMLSerializerBase::RangeFunctor,
  -                    IdentWriter,
  +                    XalanXMLSerializerBase::CharFunctor1_0,
  +                    IndentWriter,
                       FormatterListener::XML_VERSION_1_0>  Type;
   
                   theFormatter =
  @@ -154,15 +148,13 @@
               }
               else // doIndent == false
               {      
  -                typedef XalanDummyIndentWriter<XalanUTF8Writer> IdentWriter;
  +                typedef XalanDummyIndentWriter<XalanUTF8Writer> IndentWriter;
   
                   typedef FormatterToXMLUnicode<
                       XalanUTF8Writer,
                       XalanXMLSerializerBase::UTF8,
  -                    XalanXMLSerializerBase::AttributeFunctor1_0,
  -                    XalanXMLSerializerBase::ContentFunctor1_0,
  -                    XalanXMLSerializerBase::RangeFunctor,
  -                    IdentWriter,
  +                    XalanXMLSerializerBase::CharFunctor1_0,
  +                    IndentWriter,
                       FormatterListener::XML_VERSION_1_0>  Type;
   
                   theFormatter =
  @@ -194,9 +186,7 @@
                   typedef FormatterToXMLUnicode<
                               XalanUTF16Writer,
                               XalanXMLSerializerBase::UTF16,
  -                            XalanXMLSerializerBase::AttributeFunctor1_1,
  -                            XalanXMLSerializerBase::ContentFunctor1_1,
  -                            XalanXMLSerializerBase::RangeFunctor,
  +                            XalanXMLSerializerBase::CharFunctor1_1,
                               IdentWriter,
                               FormatterListener::XML_VERSION_1_1>  Type;
   
  @@ -218,9 +208,7 @@
                   typedef FormatterToXMLUnicode<
                               XalanUTF16Writer,
                               XalanXMLSerializerBase::UTF16,
  -                            XalanXMLSerializerBase::AttributeFunctor1_1,
  -                            XalanXMLSerializerBase::ContentFunctor1_1,
  -                            XalanXMLSerializerBase::RangeFunctor,
  +                            XalanXMLSerializerBase::CharFunctor1_1,
                               IdentWriter,
                               FormatterListener::XML_VERSION_1_1>  Type;
   
  @@ -248,9 +236,7 @@
                   typedef FormatterToXMLUnicode<
                       XalanUTF16Writer,
                       XalanXMLSerializerBase::UTF16,
  -                    XalanXMLSerializerBase::AttributeFunctor1_0,
  -                    XalanXMLSerializerBase::ContentFunctor1_0,
  -                    XalanXMLSerializerBase::RangeFunctor,
  +                    XalanXMLSerializerBase::CharFunctor1_0,
                       IdentWriter,
                       FormatterListener::XML_VERSION_1_0>  Type;
   
  @@ -272,9 +258,7 @@
                   typedef FormatterToXMLUnicode<
                       XalanUTF16Writer,
                       XalanXMLSerializerBase::UTF16,
  -                    XalanXMLSerializerBase::AttributeFunctor1_0,
  -                    XalanXMLSerializerBase::ContentFunctor1_0,
  -                    XalanXMLSerializerBase::RangeFunctor,
  +                    XalanXMLSerializerBase::CharFunctor1_0,
                       IdentWriter,
                       FormatterListener::XML_VERSION_1_0>  Type;
   
  @@ -294,7 +278,7 @@
       }
       else // all other encodings
       {
  -        typedef XalanOtherEncodingWriter<   XalanFormatterWriter::CommonPresentableCharFunctor,
  +        typedef XalanOtherEncodingWriter<   XalanFormatterWriter::CommonRepresentableCharFunctor,
                                               XalanXMLSerializerBase::UTF16> WriterType ;
   
           if( isVersion1_1 == true)
  @@ -304,16 +288,14 @@
                   typedef XalanFormatterWriter::NewLineWriterFunctor<WriterType> NewLineWriter;
                   typedef XalanFormatterWriter::WhiteSpaceWriterFunctor<WriterType> WhiteSpaceWriter;
   
  -                typedef XalanIndentWriter<WhiteSpaceWriter,NewLineWriter> IdentWriter;
  +                typedef XalanIndentWriter<WhiteSpaceWriter,NewLineWriter> IndentWriter;
   
   
                   typedef FormatterToXMLUnicode<
                       WriterType,
                       XalanXMLSerializerBase::UTF16,
  -                    XalanXMLSerializerBase::AttributeFunctor1_1,
  -                    XalanXMLSerializerBase::ContentFunctor1_1,
  -                    XalanXMLSerializerBase::RangeFunctor,
  -                    IdentWriter,
  +                    XalanXMLSerializerBase::CharFunctor1_1,
  +                    IndentWriter,
                       FormatterListener::XML_VERSION_1_1>  Type;
   
                   theFormatter =
  @@ -329,15 +311,13 @@
               }
               else
               {
  -                typedef XalanDummyIndentWriter<WriterType> IdentWriter;
  +                typedef XalanDummyIndentWriter<WriterType> IndentWriter;
   
                   typedef FormatterToXMLUnicode<
                       WriterType,
                       XalanXMLSerializerBase::UTF16,
  -                    XalanXMLSerializerBase::AttributeFunctor1_1,
  -                    XalanXMLSerializerBase::ContentFunctor1_1,
  -                    XalanXMLSerializerBase::RangeFunctor,
  -                    IdentWriter,
  +                    XalanXMLSerializerBase::CharFunctor1_1,
  +                    IndentWriter,
                       FormatterListener::XML_VERSION_1_1>  Type;
   
                   theFormatter =
  @@ -360,15 +340,13 @@
                   typedef XalanFormatterWriter::NewLineWriterFunctor<WriterType> NewLineWriter;
                   typedef XalanFormatterWriter::WhiteSpaceWriterFunctor<WriterType> WhiteSpaceWriter;
   
  -                typedef XalanIndentWriter<WhiteSpaceWriter,NewLineWriter> IdentWriter;
  +                typedef XalanIndentWriter<WhiteSpaceWriter,NewLineWriter> IndentWriter;
   
                   typedef FormatterToXMLUnicode<
                       WriterType,
                       XalanXMLSerializerBase::UTF16,
  -                    XalanXMLSerializerBase::AttributeFunctor1_0,
  -                    XalanXMLSerializerBase::ContentFunctor1_0,
  -                    XalanXMLSerializerBase::RangeFunctor,
  -                    IdentWriter,
  +                    XalanXMLSerializerBase::CharFunctor1_0,
  +                    IndentWriter,
                       FormatterListener::XML_VERSION_1_0>  Type;
   
                   theFormatter =
  @@ -384,15 +362,13 @@
               }
               else //doIndent == false
               {
  -                typedef XalanDummyIndentWriter<WriterType> IdentWriter;
  +                typedef XalanDummyIndentWriter<WriterType> IndentWriter;
   
                   typedef FormatterToXMLUnicode<
                       WriterType,
                       XalanXMLSerializerBase::UTF16,
  -                    XalanXMLSerializerBase::AttributeFunctor1_0,
  -                    XalanXMLSerializerBase::ContentFunctor1_0,
  -                    XalanXMLSerializerBase::RangeFunctor,
  -                    IdentWriter,
  +                    XalanXMLSerializerBase::CharFunctor1_0,
  +                    IndentWriter,
                       FormatterListener::XML_VERSION_1_0>  Type;
   
                   theFormatter =
  
  
  

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