/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the  "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


// Class header file.
#include "XalanXMLSerializerBase.hpp"



#include "xercesc/sax/SAXException.hpp"



#include "xalanc/PlatformSupport/DOMStringHelper.hpp"
#include "xalanc/PlatformSupport/XalanMessageLoader.hpp"
#include "xalanc/PlatformSupport/XalanTranscodingServices.hpp"
#include "xalanc/PlatformSupport/Writer.hpp"



XALAN_CPP_NAMESPACE_BEGIN

const size_t  XalanXMLSerializerBase::CharFunctor1_0::s_lastSpecial = 0x7fu;

const char  XalanXMLSerializerBase::CharFunctor1_0::s_specialChars[s_lastSpecial + 1] =
{
 /* 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,
 /* 38-3F */    eNone,  eNone,  eNone,  eNone,  eBoth,  eNone,  eBoth,  eNone,
 /* 40-47 */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
 /* 48-4F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
 /* 50-57 */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
 /* 58-5F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
 /* 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
};


const size_t  XalanXMLSerializerBase::CharFunctor1_1::s_lastSpecial = 0x9fu;

const char  XalanXMLSerializerBase::CharFunctor1_1::s_specialChars[s_lastSpecial + 1] =
{
 /* 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,
 /* 38-3F */    eNone,  eNone,  eNone,  eNone,  eBoth,  eNone,  eBoth,  eNone,
 /* 40-47 */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
 /* 48-4F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
 /* 50-57 */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
 /* 58-5F */    eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,  eNone,
 /* 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,  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,
            const XalanDOMString&       theEncoding,
            const XalanDOMString&       theDoctypeSystem,
            const XalanDOMString&       theDoctypePublic,
            bool                        xmlDecl,
            const XalanDOMString&       theStandalone) :
    FormatterListener(OUTPUT_METHOD_XML),
    m_nextIsRaw(false),
    m_spaceBeforeClose(false),
    m_doctypeSystem(theDoctypeSystem, theManager),
    m_doctypePublic(theDoctypePublic, theManager),
    m_version(
        theXMLVersion == XML_VERSION_1_0 ?
            s_1_0String :
            s_1_1String),
    m_standalone(theStandalone, theManager),
    m_encoding(theEncoding, theManager),
    m_needToOutputDoctypeDecl(false),
    // We must write the XML declaration if standalone is specified
    m_shouldWriteXMLHeader(xmlDecl == true ? true : theStandalone.length() != 0),
    m_elemStack(theManager)
{
    setXMLVersion(theXMLVersion);

    if(isEmpty(m_doctypePublic) == false)
    {
        if(startsWith(
            m_doctypePublic,
            s_xhtmlDocTypeString) == true)
        {
            m_spaceBeforeClose = true;
        }
    }
}



XalanXMLSerializerBase::~XalanXMLSerializerBase()
{
}



unsigned int
XalanXMLSerializerBase::decodeUTF16SurrogatePair(
            XalanDOMChar    theHighSurrogate,
            XalanDOMChar    theLowSurrogate,
            MemoryManager& theManager)
{
    assert(isUTF16HighSurrogate(theHighSurrogate) == true);

    if (isUTF16LowSurrogate(theLowSurrogate) == false)
    {
        throwInvalidUTF16SurrogateException(
            theHighSurrogate,
            theLowSurrogate,
            theManager);
    }

    return ((theHighSurrogate - 0xD800u) << 10) + theLowSurrogate - 0xDC00u + 0x00010000u;
}



XALAN_USING_XERCES(SAXException)

void
XalanXMLSerializerBase::throwInvalidUTF16SurrogateException(
            XalanDOMChar        ch,
            MemoryManager&  theManager)
{
    XalanDOMString  theMessage(theManager);
    XalanDOMString  theBuffer(theManager);

    XalanMessageLoader::getMessage(
        theMessage,
        XalanMessages::InvalidHighSurrogate_1Param,
        UnsignedLongToHexDOMString(ch, theBuffer));

    throw SAXException(c_wstr(theMessage), &theManager);
}



void
XalanXMLSerializerBase::throwInvalidUTF16SurrogateException(
            XalanDOMChar    ch,
            XalanDOMChar    next,
            MemoryManager&  theManager)
{
    XalanDOMString  theMessage(theManager);
    XalanDOMString  theBuffer1(theManager);
    XalanDOMString  theBuffer2(theManager);

    XalanMessageLoader::getMessage(
        theMessage,
        XalanMessages::InvalidSurrogatePair_2Param,
        UnsignedLongToHexDOMString(ch, theBuffer1),
        UnsignedLongToHexDOMString(next, theBuffer2));

    throw SAXException(theMessage.c_str(), &theManager);
}



void
XalanXMLSerializerBase::throwInvalidCharacterException(
            unsigned int        ch,
            MemoryManager&  theManager)
{
    XalanDOMString  theMessage(theManager);
    XalanDOMString  theBuffer(theManager);  

    XalanMessageLoader::getMessage(
        theMessage,
        XalanMessages::InvalidScalar_1Param,
        UnsignedLongToHexDOMString(ch, theBuffer));

    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
XalanXMLSerializerBase::setDocumentLocator(const LocatorType* const     /* locator */)
{
}



void
XalanXMLSerializerBase::startDocument()
{
    if (m_doctypeSystem.empty() == false)
    {
        m_needToOutputDoctypeDecl = true;
    }

    if(m_shouldWriteXMLHeader == true)
    {
        writeXMLHeader();

        // Write a newline here, so the DOCTYPE comes out on a separate line
        if (m_needToOutputDoctypeDecl == true)
        {
            outputNewline();
        }
    }
}




void
XalanXMLSerializerBase::characters(
            const XMLCh* const  chars,
            const size_type     length)
{
    if(length != 0)
    {
        if(m_nextIsRaw)
        {
            m_nextIsRaw = false;

            charactersRaw(chars, length);
        }
        else
        {
            writeCharacters(chars, length);
        }
    }
}



void
XalanXMLSerializerBase::cdata(
            const XMLCh* const  ch,
            const size_type     length)
{
    if (length != 0)
    {
        if(m_nextIsRaw == true)
        {
            m_nextIsRaw = false;

            charactersRaw(ch, length);
        }
        else
        {
            writeCDATA(ch, length);
        }
    }
}



void
XalanXMLSerializerBase::processingInstruction(
            const XMLCh* const  target,
            const XMLCh* const  data)
{
    // Use a fairly nasty hack to tell if the next node is supposed to be 
    // unescaped text.
    if(equals(target, length(target), s_piTarget, s_piTargetLength) == true &&
       equals(data, length(data), s_piData, s_piDataLength) == true)
    {
        m_nextIsRaw = true;
    }
    else    
    {
        writeProcessingInstruction(target, data);
    }
}



void
XalanXMLSerializerBase::ignorableWhitespace(
            const XMLCh* const  chars,
            const size_type     length)
{
    if (length > 0)
    {
        characters(chars, length);
    }
}



const XalanDOMString&
XalanXMLSerializerBase::getDoctypeSystem() const
{
    return m_doctypeSystem;
}



const XalanDOMString&
XalanXMLSerializerBase::getDoctypePublic() const
{
    return m_doctypePublic;
}



const XalanDOMString&
XalanXMLSerializerBase::getEncoding() const
{
    return m_encoding;
}



void
XalanXMLSerializerBase::resetDocument()
{
    // I don't do anything with this yet.
}



#define FXML_SIZE(str)  ((sizeof(str) / sizeof(str[0]) - 1))

const XalanDOMChar  XalanXMLSerializerBase::s_xhtmlDocTypeString[] =
{
    XalanUnicode::charHyphenMinus,
    XalanUnicode::charSolidus,
    XalanUnicode::charSolidus,
    XalanUnicode::charLetter_W,
    XalanUnicode::charDigit_3,
    XalanUnicode::charLetter_C,
    XalanUnicode::charSolidus,
    XalanUnicode::charSolidus,
    XalanUnicode::charLetter_D,
    XalanUnicode::charLetter_T,
    XalanUnicode::charLetter_D,
    XalanUnicode::charSpace,
    XalanUnicode::charLetter_X,
    XalanUnicode::charLetter_H,
    XalanUnicode::charLetter_T,
    XalanUnicode::charLetter_M,
    XalanUnicode::charLetter_L,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::s_xhtmlDocTypeStringLength =
        FXML_SIZE(s_xhtmlDocTypeString);


static XalanDOMString   s_localUTF8String(XalanMemMgrs::getDummyMemMgr());
static XalanDOMString   s_localUTF16String(XalanMemMgrs::getDummyMemMgr());
static XalanDOMString   s_local1_0String(XalanMemMgrs::getDummyMemMgr());
static XalanDOMString   s_local1_1String(XalanMemMgrs::getDummyMemMgr());

static const XalanDOMChar   s_1_1VersionString[] =
{
    XalanUnicode::charDigit_1,
    XalanUnicode::charFullStop,
    XalanUnicode::charDigit_1,
    XalanDOMChar(0)
};



void
XalanXMLSerializerBase::initialize(MemoryManager&   theManager)
{
    {
        XalanDOMString theTmp(XalanTranscodingServices::s_utf8String, theManager);

        s_localUTF8String.swap(theTmp);
    }

    {
        XalanDOMString theTmp(XalanTranscodingServices::s_utf16String, theManager);

        s_localUTF16String.swap(theTmp);
    }

    {
        XalanDOMString theTmp(UTF16::s_defaultVersionString, theManager);

        s_local1_0String.swap(theTmp);
    }

    {
        XalanDOMString theTmp(s_1_1VersionString, theManager);

        s_local1_1String.swap(theTmp);
    }
}



void
XalanXMLSerializerBase::terminate()
{
    {
        XalanDOMString   temp(XalanMemMgrs::getDummyMemMgr());

        temp.swap(s_localUTF8String);
    }

    {
        XalanDOMString   temp(XalanMemMgrs::getDummyMemMgr());

        temp.swap(s_localUTF16String);
    }

    {
        XalanDOMString   temp(XalanMemMgrs::getDummyMemMgr());

        temp.swap(s_local1_0String);
    }

    {
        XalanDOMString   temp(XalanMemMgrs::getDummyMemMgr());

        temp.swap(s_local1_1String);
    }
}



const XalanDOMString&   XalanXMLSerializerBase::UTF8::s_encodingString = s_localUTF8String;
const XalanDOMString&   XalanXMLSerializerBase::UTF16::s_encodingString = s_localUTF16String;
const XalanDOMString&   XalanXMLSerializerBase::s_1_0String = s_local1_0String;
const XalanDOMString&   XalanXMLSerializerBase::s_1_1String = s_local1_1String;



const char  XalanXMLSerializerBase::UTF8::s_doctypeHeaderStartString[] =
{
    char(XalanUnicode::charLessThanSign),
    char(XalanUnicode::charExclamationMark),
    char(XalanUnicode::charLetter_D),
    char(XalanUnicode::charLetter_O),
    char(XalanUnicode::charLetter_C),
    char(XalanUnicode::charLetter_T),
    char(XalanUnicode::charLetter_Y),
    char(XalanUnicode::charLetter_P),
    char(XalanUnicode::charLetter_E),
    char(XalanUnicode::charSpace),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_doctypeHeaderStartStringLength =
        FXML_SIZE(s_doctypeHeaderStartString);

const char  XalanXMLSerializerBase::UTF8::s_doctypeHeaderPublicString[] =
{
    char(XalanUnicode::charSpace),
    char(XalanUnicode::charLetter_P),
    char(XalanUnicode::charLetter_U),
    char(XalanUnicode::charLetter_B),
    char(XalanUnicode::charLetter_L),
    char(XalanUnicode::charLetter_I),
    char(XalanUnicode::charLetter_C),
    char(XalanUnicode::charSpace),
    char(XalanUnicode::charQuoteMark),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_doctypeHeaderPublicStringLength =
        FXML_SIZE(s_doctypeHeaderPublicString);

const char  XalanXMLSerializerBase::UTF8::s_doctypeHeaderSystemString[] =
{
    char(XalanUnicode::charSpace),
    char(XalanUnicode::charLetter_S),
    char(XalanUnicode::charLetter_Y),
    char(XalanUnicode::charLetter_S),
    char(XalanUnicode::charLetter_T),
    char(XalanUnicode::charLetter_E),
    char(XalanUnicode::charLetter_M),
    char(XalanUnicode::charSpace),
    char(XalanUnicode::charQuoteMark),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_doctypeHeaderSystemStringLength =
        FXML_SIZE(s_doctypeHeaderSystemString);

const char  XalanXMLSerializerBase::UTF8::s_xmlHeaderStartString[] =
{
    char(XalanUnicode::charLessThanSign),
    char(XalanUnicode::charQuestionMark),
    char(XalanUnicode::charLetter_x),
    char(XalanUnicode::charLetter_m),
    char(XalanUnicode::charLetter_l),
    char(XalanUnicode::charSpace),
    char(XalanUnicode::charLetter_v),
    char(XalanUnicode::charLetter_e),
    char(XalanUnicode::charLetter_r),
    char(XalanUnicode::charLetter_s),
    char(XalanUnicode::charLetter_i),
    char(XalanUnicode::charLetter_o),
    char(XalanUnicode::charLetter_n),
    char(XalanUnicode::charEqualsSign),
    char(XalanUnicode::charQuoteMark),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_xmlHeaderStartStringLength =
        FXML_SIZE(s_xmlHeaderStartString);

const char  XalanXMLSerializerBase::UTF8::s_xmlHeaderEncodingString[] =
{
    char(XalanUnicode::charQuoteMark),
    char(XalanUnicode::charSpace),
    char(XalanUnicode::charLetter_e),
    char(XalanUnicode::charLetter_n),
    char(XalanUnicode::charLetter_c),
    char(XalanUnicode::charLetter_o),
    char(XalanUnicode::charLetter_d),
    char(XalanUnicode::charLetter_i),
    char(XalanUnicode::charLetter_n),
    char(XalanUnicode::charLetter_g),
    char(XalanUnicode::charEqualsSign),
    char(XalanUnicode::charQuoteMark),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_xmlHeaderEncodingStringLength =
        FXML_SIZE(s_xmlHeaderEncodingString);

const char  XalanXMLSerializerBase::UTF8::s_xmlHeaderStandaloneString[] =
{
    char(XalanUnicode::charQuoteMark),
    char(XalanUnicode::charSpace),
    char(XalanUnicode::charLetter_s),
    char(XalanUnicode::charLetter_t),
    char(XalanUnicode::charLetter_a),
    char(XalanUnicode::charLetter_n),
    char(XalanUnicode::charLetter_d),
    char(XalanUnicode::charLetter_a),
    char(XalanUnicode::charLetter_l),
    char(XalanUnicode::charLetter_o),
    char(XalanUnicode::charLetter_n),
    char(XalanUnicode::charLetter_e),
    char(XalanUnicode::charEqualsSign),
    char(XalanUnicode::charQuoteMark),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_xmlHeaderStandaloneStringLength =
        FXML_SIZE(s_xmlHeaderStandaloneString);

const char  XalanXMLSerializerBase::UTF8::s_xmlHeaderEndString[] =
{
    char(XalanUnicode::charQuoteMark),
    char(XalanUnicode::charQuestionMark),
    char(XalanUnicode::charGreaterThanSign),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_xmlHeaderEndStringLength =
        FXML_SIZE(s_xmlHeaderEndString);

const char  XalanXMLSerializerBase::UTF8::s_defaultVersionString[] =
{
    char(XalanUnicode::charDigit_1),
    char(XalanUnicode::charFullStop),
    char(XalanUnicode::charDigit_0),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_defaultVersionStringLength =
        FXML_SIZE(s_defaultVersionString);

const char  XalanXMLSerializerBase::UTF8::s_cdataOpenString[] =
{
    char(XalanUnicode::charLessThanSign),
    char(XalanUnicode::charExclamationMark),
    char(XalanUnicode::charLeftSquareBracket),
    char(XalanUnicode::charLetter_C),
    char(XalanUnicode::charLetter_D),
    char(XalanUnicode::charLetter_A),
    char(XalanUnicode::charLetter_T),
    char(XalanUnicode::charLetter_A),
    char(XalanUnicode::charLeftSquareBracket),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_cdataOpenStringLength =
        FXML_SIZE(s_cdataOpenString);

const char  XalanXMLSerializerBase::UTF8::s_cdataCloseString[] =
{
    char(XalanUnicode::charRightSquareBracket),
    char(XalanUnicode::charRightSquareBracket),
    char(XalanUnicode::charGreaterThanSign),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_cdataCloseStringLength =
        FXML_SIZE(s_cdataCloseString);


const XalanDOMChar  XalanXMLSerializerBase::UTF8::s_xhtmlDocTypeString[] =
{
    XalanUnicode::charHyphenMinus,
    XalanUnicode::charSolidus,
    XalanUnicode::charSolidus,
    XalanUnicode::charLetter_W,
    XalanUnicode::charDigit_3,
    XalanUnicode::charLetter_C,
    XalanUnicode::charSolidus,
    XalanUnicode::charSolidus,
    XalanUnicode::charLetter_D,
    XalanUnicode::charLetter_T,
    XalanUnicode::charLetter_D,
    XalanUnicode::charSpace,
    XalanUnicode::charLetter_X,
    XalanUnicode::charLetter_H,
    XalanUnicode::charLetter_T,
    XalanUnicode::charLetter_M,
    XalanUnicode::charLetter_L,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_xhtmlDocTypeStringLength =
        FXML_SIZE(s_xhtmlDocTypeString);

const char  XalanXMLSerializerBase::UTF8::s_lessThanEntityString[] =
{
    char(XalanUnicode::charAmpersand),
    char(XalanUnicode::charLetter_l),
    char(XalanUnicode::charLetter_t),
    char(XalanUnicode::charSemicolon),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_lessThanEntityStringLength =
        FXML_SIZE(s_lessThanEntityString);

const char  XalanXMLSerializerBase::UTF8::s_greaterThanEntityString[] =
{
    char(XalanUnicode::charAmpersand),
    char(XalanUnicode::charLetter_g),
    char(XalanUnicode::charLetter_t),
    char(XalanUnicode::charSemicolon),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_greaterThanEntityStringLength =
        FXML_SIZE(s_greaterThanEntityString);

const char  XalanXMLSerializerBase::UTF8::s_ampersandEntityString[] =
{
    char(XalanUnicode::charAmpersand),
    char(XalanUnicode::charLetter_a),
    char(XalanUnicode::charLetter_m),
    char(XalanUnicode::charLetter_p),
    char(XalanUnicode::charSemicolon),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_ampersandEntityStringLength =
        FXML_SIZE(s_ampersandEntityString);

const char  XalanXMLSerializerBase::UTF8::s_quoteEntityString[] =
{
    char(XalanUnicode::charAmpersand),
    char(XalanUnicode::charLetter_q),
    char(XalanUnicode::charLetter_u),
    char(XalanUnicode::charLetter_o),
    char(XalanUnicode::charLetter_t),
    char(XalanUnicode::charSemicolon),
    char(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF8::s_quoteEntityStringLength =
        FXML_SIZE(s_quoteEntityString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_doctypeHeaderStartString[] =
{
    XalanUnicode::charLessThanSign,
    XalanUnicode::charExclamationMark,
    XalanUnicode::charLetter_D,
    XalanUnicode::charLetter_O,
    XalanUnicode::charLetter_C,
    XalanUnicode::charLetter_T,
    XalanUnicode::charLetter_Y,
    XalanUnicode::charLetter_P,
    XalanUnicode::charLetter_E,
    XalanUnicode::charSpace,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_doctypeHeaderStartStringLength =
        FXML_SIZE(s_doctypeHeaderStartString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_doctypeHeaderPublicString[] =
{
    XalanUnicode::charSpace,
    XalanUnicode::charLetter_P,
    XalanUnicode::charLetter_U,
    XalanUnicode::charLetter_B,
    XalanUnicode::charLetter_L,
    XalanUnicode::charLetter_I,
    XalanUnicode::charLetter_C,
    XalanUnicode::charSpace,
    XalanUnicode::charQuoteMark,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_doctypeHeaderPublicStringLength =
        FXML_SIZE(s_doctypeHeaderPublicString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_doctypeHeaderSystemString[] =
{
    XalanUnicode::charSpace,
    XalanUnicode::charLetter_S,
    XalanUnicode::charLetter_Y,
    XalanUnicode::charLetter_S,
    XalanUnicode::charLetter_T,
    XalanUnicode::charLetter_E,
    XalanUnicode::charLetter_M,
    XalanUnicode::charSpace,
    XalanUnicode::charQuoteMark,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_doctypeHeaderSystemStringLength =
        FXML_SIZE(s_doctypeHeaderSystemString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_xmlHeaderStartString[] =
{
    XalanUnicode::charLessThanSign,
    XalanUnicode::charQuestionMark,
    XalanUnicode::charLetter_x,
    XalanUnicode::charLetter_m,
    XalanUnicode::charLetter_l,
    XalanUnicode::charSpace,
    XalanUnicode::charLetter_v,
    XalanUnicode::charLetter_e,
    XalanUnicode::charLetter_r,
    XalanUnicode::charLetter_s,
    XalanUnicode::charLetter_i,
    XalanUnicode::charLetter_o,
    XalanUnicode::charLetter_n,
    XalanUnicode::charEqualsSign,
    XalanUnicode::charQuoteMark,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_xmlHeaderStartStringLength =
        FXML_SIZE(s_xmlHeaderStartString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_xmlHeaderEncodingString[] =
{
    XalanUnicode::charQuoteMark,
    XalanUnicode::charSpace,
    XalanUnicode::charLetter_e,
    XalanUnicode::charLetter_n,
    XalanUnicode::charLetter_c,
    XalanUnicode::charLetter_o,
    XalanUnicode::charLetter_d,
    XalanUnicode::charLetter_i,
    XalanUnicode::charLetter_n,
    XalanUnicode::charLetter_g,
    XalanUnicode::charEqualsSign,
    XalanUnicode::charQuoteMark,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_xmlHeaderEncodingStringLength =
        FXML_SIZE(s_xmlHeaderEncodingString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_xmlHeaderStandaloneString[] =
{
    XalanUnicode::charQuoteMark,
    XalanUnicode::charSpace,
    XalanUnicode::charLetter_s,
    XalanUnicode::charLetter_t,
    XalanUnicode::charLetter_a,
    XalanUnicode::charLetter_n,
    XalanUnicode::charLetter_d,
    XalanUnicode::charLetter_a,
    XalanUnicode::charLetter_l,
    XalanUnicode::charLetter_o,
    XalanUnicode::charLetter_n,
    XalanUnicode::charLetter_e,
    XalanUnicode::charEqualsSign,
    XalanUnicode::charQuoteMark,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_xmlHeaderStandaloneStringLength =
        FXML_SIZE(s_xmlHeaderStandaloneString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_xmlHeaderEndString[] =
{
    XalanUnicode::charQuoteMark,
    XalanUnicode::charQuestionMark,
    XalanUnicode::charGreaterThanSign,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_xmlHeaderEndStringLength =
        FXML_SIZE(s_xmlHeaderEndString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_defaultVersionString[] =
{
    XalanUnicode::charDigit_1,
    XalanUnicode::charFullStop,
    XalanUnicode::charDigit_0,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_defaultVersionStringLength =
        FXML_SIZE(s_defaultVersionString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_cdataOpenString[] =
{
    XalanUnicode::charLessThanSign,
    XalanUnicode::charExclamationMark,
    XalanUnicode::charLeftSquareBracket,
    XalanUnicode::charLetter_C,
    XalanUnicode::charLetter_D,
    XalanUnicode::charLetter_A,
    XalanUnicode::charLetter_T,
    XalanUnicode::charLetter_A,
    XalanUnicode::charLeftSquareBracket,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_cdataOpenStringLength =
        FXML_SIZE(s_cdataOpenString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_cdataCloseString[] =
{
    XalanUnicode::charRightSquareBracket,
    XalanUnicode::charRightSquareBracket,
    XalanUnicode::charGreaterThanSign,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_cdataCloseStringLength =
        FXML_SIZE(s_cdataCloseString);


const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_xhtmlDocTypeString[] =
{
    XalanUnicode::charHyphenMinus,
    XalanUnicode::charSolidus,
    XalanUnicode::charSolidus,
    XalanUnicode::charLetter_W,
    XalanUnicode::charDigit_3,
    XalanUnicode::charLetter_C,
    XalanUnicode::charSolidus,
    XalanUnicode::charSolidus,
    XalanUnicode::charLetter_D,
    XalanUnicode::charLetter_T,
    XalanUnicode::charLetter_D,
    XalanUnicode::charSpace,
    XalanUnicode::charLetter_X,
    XalanUnicode::charLetter_H,
    XalanUnicode::charLetter_T,
    XalanUnicode::charLetter_M,
    XalanUnicode::charLetter_L,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_xhtmlDocTypeStringLength =
        FXML_SIZE(s_xhtmlDocTypeString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_lessThanEntityString[] =
{
    XalanUnicode::charAmpersand,
    XalanUnicode::charLetter_l,
    XalanUnicode::charLetter_t,
    XalanUnicode::charSemicolon,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_lessThanEntityStringLength =
        FXML_SIZE(s_lessThanEntityString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_greaterThanEntityString[] =
{
    XalanUnicode::charAmpersand,
    XalanUnicode::charLetter_g,
    XalanUnicode::charLetter_t,
    XalanUnicode::charSemicolon,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_greaterThanEntityStringLength =
        FXML_SIZE(s_greaterThanEntityString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_ampersandEntityString[] =
{
    XalanUnicode::charAmpersand,
    XalanUnicode::charLetter_a,
    XalanUnicode::charLetter_m,
    XalanUnicode::charLetter_p,
    XalanUnicode::charSemicolon,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_ampersandEntityStringLength =
        FXML_SIZE(s_ampersandEntityString);

const XalanDOMChar  XalanXMLSerializerBase::UTF16::s_quoteEntityString[] =
{
    XalanUnicode::charAmpersand,
    XalanUnicode::charLetter_q,
    XalanUnicode::charLetter_u,
    XalanUnicode::charLetter_o,
    XalanUnicode::charLetter_t,
    XalanUnicode::charSemicolon,
    XalanDOMChar(0)
};

const XalanXMLSerializerBase::size_type     XalanXMLSerializerBase::UTF16::s_quoteEntityStringLength =
        FXML_SIZE(s_quoteEntityString);



XALAN_CPP_NAMESPACE_END
