ParserTest_Parser.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:34k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2000 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Log: ParserTest_Parser.cpp,v $
  58.  * Revision 1.10  2002/02/01 22:45:54  peiyongz
  59.  * sane_include
  60.  *
  61.  * Revision 1.9  2001/11/28 21:15:08  tng
  62.  * Fix broken ParserTest.
  63.  *
  64.  * Revision 1.8  2000/03/02 19:55:46  roddey
  65.  * This checkin includes many changes done while waiting for the
  66.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  67.  * available elsewhere.
  68.  *
  69.  * Revision 1.7  2000/02/06 07:48:37  rahulj
  70.  * Year 2K copyright swat.
  71.  *
  72.  * Revision 1.6  2000/01/27 20:31:31  roddey
  73.  * More recovery from the move away from the util/xx streams.
  74.  *
  75.  * Revision 1.5  2000/01/26 19:35:57  roddey
  76.  * When the /Debug output format is used, it will spit out source offset
  77.  * data as well now.
  78.  *
  79.  * Revision 1.4  2000/01/25 01:02:12  roddey
  80.  * More small fixes in the output from the recent change to get away from
  81.  * the util/xx streams.
  82.  *
  83.  * Revision 1.3  2000/01/21 23:58:06  roddey
  84.  * Initial move away from util streams was bad. Wide char APIs didn't allow enough
  85.  * control to do canonical output, so changed to use std short char APIs.
  86.  *
  87.  * Revision 1.1  1999/11/09 01:02:22  twl
  88.  * Initial revision
  89.  *
  90.  * Revision 1.3  1999/11/08 20:42:25  rahul
  91.  * Swat for adding in Product name and CVS comment log variable.
  92.  *
  93.  */
  94. // ---------------------------------------------------------------------------
  95. //  Includes
  96. // ---------------------------------------------------------------------------
  97. #include <xercesc/util/RefVectorOf.hpp>
  98. #include <xercesc/util/XMLString.hpp>
  99. #include <xercesc/util/XMLUni.hpp>
  100. #include <xercesc/internal/XMLReader.hpp>
  101. #include <xercesc/internal/XMLScanner.hpp>
  102. #include <xercesc/framework/XMLAttr.hpp>
  103. #include <xercesc/framework/XMLNotationDecl.hpp>
  104. #include <xercesc/framework/XMLValidator.hpp>
  105. #include <xercesc/validators/DTD/DTDAttDef.hpp>
  106. #include <xercesc/validators/DTD/DTDElementDecl.hpp>
  107. #include <xercesc/validators/DTD/DTDEntityDecl.hpp>
  108. #include "ParserTest.hpp"
  109. #include <stdlib.h>
  110. #include <ctype.h>
  111. // ---------------------------------------------------------------------------
  112. //  Local functions
  113. // ---------------------------------------------------------------------------
  114. static int attrComp(const void* elemOne, const void* elemTwo)
  115. {
  116.     return XMLString::compareString
  117.     (
  118.         (*(XMLAttr**)elemOne)->getName()
  119.         , (*(XMLAttr**)elemTwo)->getName()
  120.     );
  121. }
  122. // ---------------------------------------------------------------------------
  123. //  TestParser: Constructors and Destructor
  124. // ---------------------------------------------------------------------------
  125. TestParser::TestParser() :
  126.     fDoNamespaces(false)
  127.     , fInExtSubset(false)
  128.     , fInsideRoot(false)
  129.     , fIntDTDOutput(false)
  130.     , fNestingLevel(0)
  131.     , fOutputType(OutputType_None)
  132.     , fShowErrLoc(false)
  133.     , fShowWarnings(false)
  134.     , fSurrogate(0)
  135. {
  136. }
  137. TestParser::~TestParser()
  138. {
  139. }
  140. // ---------------------------------------------------------------------------
  141. //  TestParser: The document handler interfaces
  142. // ---------------------------------------------------------------------------
  143. void TestParser::docCharacters( const   XMLCh* const    chars
  144.                                 , const unsigned int    length
  145.                                 , const bool            cdataSection)
  146. {
  147.     if (fOutputType == OutputType_Debug)
  148.     {
  149.         cout << "Got CHARS:n    Bytes: "
  150.              << length << ", CDATA?: "
  151.              << (cdataSection ? "Yes" : "No")
  152.              << "n"
  153.              << "    SrcOfs: " << fScanner->getSrcOffset()
  154.              << "n" << endl;
  155.     }
  156.      else if ((fOutputType == OutputType_JCCanon)
  157.           ||  (fOutputType == OutputType_SunCanon))
  158.     {
  159.         showChars(chars, length);
  160.     }
  161.      else if (fOutputType == OutputType_XML)
  162.     {
  163.         if (cdataSection)
  164.             cout << "<![CDATA[";
  165.         showChars(chars, length);
  166.         if (cdataSection)
  167.             cout << "]]>";
  168.     }
  169. }
  170. void TestParser::docComment(const XMLCh* const comment)
  171. {
  172.     if (fOutputType == OutputType_Debug)
  173.     {
  174.         cout << "Got document COMMENT:n    "
  175.              << "Text: "" << StrX(comment) << ""n"
  176.              << "    SrcOfs: " << fScanner->getSrcOffset()
  177.              << "n" << endl;
  178.     }
  179.      else if (fOutputType == OutputType_XML)
  180.     {
  181.         cout << "<!--";
  182.         showString(comment);
  183.         cout << "-->";
  184.     }
  185. }
  186. void TestParser::docPI( const   XMLCh* const    target
  187.                         , const XMLCh* const    data)
  188. {
  189.     if (fOutputType == OutputType_Debug)
  190.     {
  191.         cout << "Got document PI:n     "
  192.              << "Target: "" << target << '"';
  193.         if (XMLString::stringLen(data))
  194.             cout << ", Data: "" << StrX(data) << ""n";
  195.         cout << "    SrcOfs: " << fScanner->getSrcOffset()
  196.              << "n" << endl;
  197.     }
  198.      else if ((fOutputType == OutputType_XML)
  199.           ||  (fOutputType == OutputType_JCCanon)
  200.           ||  (fOutputType == OutputType_SunCanon))
  201.     {
  202.         cout << "<?";
  203.         showString(target);
  204.         cout << " ";
  205.         if (XMLString::stringLen(data))
  206.             cout << StrX(data);
  207.         cout << "?>";
  208.     }
  209. }
  210. void TestParser::endDocument()
  211. {
  212.     if (fOutputType == OutputType_Debug)
  213.     {
  214.         cout << "Got ENDDOCUMENT:n"
  215.              << "    SrcOfs: " << fScanner->getSrcOffset()
  216.              << "n" << endl;
  217.     }
  218.      else if (fOutputType == OutputType_SunCanon)
  219.     {
  220.         cout << "rn";
  221.     }
  222. }
  223. void TestParser::endElement(const   XMLElementDecl& elemDecl
  224.                             , const unsigned int    uriId
  225.                             , const bool            isRoot)
  226. {
  227.     if (fOutputType == OutputType_Debug)
  228.     {
  229.         if (fDoNamespaces)
  230.         {
  231.             XMLBuffer bufURI;
  232.             fScanner->getURIText(uriId, bufURI);
  233.             cout << "Got ENDELEMENT:n    Name: "
  234.                  << "{" << StrX(bufURI.getRawBuffer()) << "}"
  235.                  << StrX(elemDecl.getBaseName())
  236.                  << endl;
  237.         }
  238.          else
  239.         {
  240.             cout << "Got ENDELEMENT:n    Name: "
  241.                  << StrX(elemDecl.getFullName()) << endl;
  242.         }
  243.         cout << "    SrcOfs: " << fScanner->getSrcOffset()
  244.              << "n" << endl;
  245.     }
  246.      else if ((fOutputType == OutputType_XML)
  247.           ||  (fOutputType == OutputType_JCCanon)
  248.           ||  (fOutputType == OutputType_SunCanon))
  249.     {
  250.         cout << "</";
  251.         showString(elemDecl.getFullName());
  252.         cout << ">";
  253.     }
  254.     // Clear the flag that says we're now inside the root
  255.     if (isRoot)
  256.         fInsideRoot = false;
  257. }
  258. void TestParser::endEntityReference(const XMLEntityDecl& entDecl)
  259. {
  260.     if (fOutputType == OutputType_Debug)
  261.     {
  262.         cout << "Got ENDENTITYREF:n    "
  263.              << "Name: " << StrX(entDecl.getName()) << "n" << endl;
  264.     }
  265. }
  266. void TestParser::ignorableWhitespace(const  XMLCh* const    chars
  267.                                     , const unsigned int    length
  268.                                     , const bool            cdataSection)
  269. {
  270.     if (fOutputType == OutputType_Debug)
  271.     {
  272.         cout << "Got WHITESPACE:n    Bytes: "
  273.              << length << ", CDATA?: "
  274.              << (cdataSection ? "Yes" : "No")
  275.              << "n"
  276.              << "    SrcOfs: " << fScanner->getSrcOffset()
  277.              << "n" << endl;
  278.     }
  279.      else if (fOutputType == OutputType_XML)
  280.     {
  281.         if (cdataSection)
  282.             cout << "<![CDATA[";
  283.         showChars(chars, length);
  284.         if (cdataSection)
  285.             cout << "]]>";
  286.     }
  287.      else if ((fOutputType == OutputType_JCCanon)
  288.           ||  (fOutputType == OutputType_SunCanon))
  289.     {
  290.         if (!fInsideRoot)
  291.             return;
  292.         showChars(chars, length);
  293.     }
  294. }
  295. void TestParser::resetDocument()
  296. {
  297.     if (fOutputType == OutputType_Debug)
  298.         cout << "Got RESETDOCUMENT:n" << endl;
  299. }
  300. void TestParser::startDocument()
  301. {
  302.     if (fOutputType == OutputType_Debug)
  303.         cout << "Got STARTDOCUMENT:n" << endl;
  304. }
  305. void
  306. TestParser::startElement(const  XMLElementDecl&         elemDecl
  307.                         , const unsigned int            uriId
  308.                         , const XMLCh* const            prefixName
  309.                         , const RefVectorOf<XMLAttr>&   attrList
  310.                         , const unsigned int            attCount
  311.                         , const bool                    isEmpty
  312.                         , const bool                    isRoot)
  313. {
  314.     // Set the flag that says we're now inside the root, if its not empty
  315.     if (isRoot && !isEmpty)
  316.         fInsideRoot = true;
  317.     if (fOutputType == OutputType_Debug)
  318.     {
  319.         XMLBuffer bufURI;
  320.         if (fDoNamespaces)
  321.         {
  322.             fScanner->getURIText(uriId, bufURI);
  323.             cout << "Got STARTELEMENT:n    "
  324.                  << " Name: {" << StrX(bufURI.getRawBuffer()) << "}"
  325.                  << StrX(elemDecl.getBaseName())
  326.                  << ", AttCount: " << attCount
  327.                  << ", Empty?: "
  328.                  << (isEmpty ? "yes" : "no")
  329.                  << "n";
  330.         }
  331.          else
  332.         {
  333.             cout << "Got STARTELEMENT:n    Name: "
  334.                  << StrX(elemDecl.getFullName())
  335.                  << ", AttCount: " << attCount
  336.                  << ", Empty?: "
  337.                  << (isEmpty ? "yes" : "no")
  338.                  << "n";
  339.         }
  340.         cout << "    SrcOfs: " << fScanner->getSrcOffset() << "n";
  341.         // If any attributes, then show them
  342.         if (attCount)
  343.         {
  344.             cout << "    Attrs: ";
  345.             for (unsigned int attInd = 0; attInd < attCount; attInd++)
  346.             {
  347.                 const XMLAttr* curAttr = attrList.elementAt(attInd);
  348.                 if (fDoNamespaces)
  349.                 {
  350.                     fScanner->getURIText(curAttr->getURIId(), bufURI);
  351.                     cout << "Name=" << "{" << StrX(bufURI.getRawBuffer())
  352.                          << "}" << StrX(curAttr->getName());
  353.                 }
  354.                  else
  355.                 {
  356.                     cout << "Name=" << StrX(curAttr->getQName());
  357.                 }
  358.                 if (curAttr->getSpecified())
  359.                     cout << " (Explicit)  ";
  360.                 else
  361.                     cout << " (Defaulted) ";
  362.                 cout << "Value=" << StrX(curAttr->getValue()) << "n"
  363.                      << "           ";
  364.             }
  365.         }
  366.         cout << endl;
  367.     }
  368.      else if (fOutputType == OutputType_XML)
  369.     {
  370.         cout << "<";
  371.         showString(elemDecl.getFullName());
  372.         if (attCount)
  373.         {
  374.             cout << " ";
  375.             for (unsigned int index = 0; index < attCount; index++)
  376.             {
  377.                 const XMLAttr* curAttr = attrList.elementAt(index);
  378.                 showString(curAttr->getQName());
  379.                 cout << "="";
  380.                 showString(curAttr->getValue());
  381.                 cout << """;
  382.                 if (index < attCount-1)
  383.                     cout << " ";
  384.             }
  385.         }
  386.         if (isEmpty)
  387.             cout << "/>";
  388.         else
  389.             cout << ">";
  390.     }
  391.      else if ((fOutputType == OutputType_JCCanon)
  392.           ||  (fOutputType == OutputType_SunCanon))
  393.     {
  394.         cout << "<";
  395.         showString(elemDecl.getFullName());
  396.         if (attCount)
  397.         {
  398.             cout << " ";
  399.             //
  400.             //  Get a list of attribute pointers. The canonical output
  401.             //  format requires sorted attributes. If we aren't doing
  402.             //  canonical output, then we don't sort it, but we still use
  403.             //  the array.
  404.             //
  405.             const XMLAttr** attrTmp = new const XMLAttr*[attCount];
  406.             unsigned int index;
  407.             for (index = 0; index < attCount; index++)
  408.                 attrTmp[index] = attrList.elementAt(index);
  409.             if (attCount > 1)
  410.                 qsort(attrTmp, attCount, sizeof(XMLAttr*), attrComp);
  411.             for (index = 0; index < attCount; index++)
  412.             {
  413.                 const XMLAttr* curAttr = attrTmp[index];
  414.                 showString(curAttr->getQName());
  415.                 cout << "="";
  416.                 showString(curAttr->getValue());
  417.                 cout << """;
  418.                 if (index < attCount-1)
  419.                     cout << " ";
  420.             }
  421.             delete [] attrTmp;
  422.         }
  423.         if (isEmpty)
  424.         {
  425.             cout << "></";
  426.             showString(elemDecl.getFullName());
  427.             cout << ">";
  428.         }
  429.          else
  430.         {
  431.             cout << ">";
  432.         }
  433.     }
  434. }
  435. void TestParser::startEntityReference(const XMLEntityDecl& entDecl)
  436. {
  437.     if (fOutputType == OutputType_Debug)
  438.     {
  439.         cout << "Got STARTENTITY:n    "
  440.              << "Name: " << StrX(entDecl.getName()) << "n" << endl;
  441.     }
  442. }
  443. void TestParser::XMLDecl(const  XMLCh* const    versionStr
  444.                         , const XMLCh* const    encodingStr
  445.                         , const XMLCh* const    standaloneStr
  446.                         , const XMLCh* const    autoEncStr)
  447. {
  448.     if (fOutputType == OutputType_Debug)
  449.     {
  450.         cout << "Got XMLDECL:n    "
  451.              << "Version:"" << StrX(versionStr) << """
  452.              << " Encoding:"" << StrX(encodingStr) << """
  453.              << " Standalone:"" << StrX(standaloneStr) << """
  454.              << " Auto Encoding:"" << StrX(autoEncStr) << """
  455.              << "n"
  456.              << "    SrcOfs: " << fScanner->getSrcOffset()
  457.              << "n" << endl;
  458.     }
  459.      else if (fOutputType == OutputType_XML)
  460.     {
  461.         cout << "<?xml";
  462.         if (XMLString::stringLen(versionStr))
  463.             cout << " version="" << StrX(versionStr) << '"';
  464.         if (XMLString::stringLen(encodingStr))
  465.             cout << " encoding="" << StrX(encodingStr) << '"';
  466.         if (XMLString::stringLen(standaloneStr))
  467.             cout  << " standlone="" << StrX(standaloneStr) << '"';
  468.         cout << " ?>";
  469.     }
  470. }
  471. // -----------------------------------------------------------------------
  472. //  TestParser: The DocTypeHandler interface
  473. // -----------------------------------------------------------------------
  474. void TestParser::attDef(const   DTDElementDecl& elemDecl
  475.                         , const DTDAttDef&      attDef
  476.                         , const bool            ignoring)
  477. {
  478.     if (fOutputType == OutputType_Debug)
  479.     {
  480.         cout << "Got ATTDEF:n    "
  481.              << "Name: " << StrX(attDef.getFullName())
  482.              << ", Type: "
  483.              << StrX(XMLAttDef::getAttTypeString(attDef.getType()))
  484.              << ", DefType: "
  485.              << StrX(XMLAttDef::getDefAttTypeString(attDef.getDefaultType()));
  486.         if (XMLString::stringLen(attDef.getValue()))
  487.             cout << ", Value: "" << StrX(attDef.getValue()) << '"';
  488.         cout << "n    SrcOfs: " << fScanner->getSrcOffset()
  489.              << "n" << endl;
  490.     }
  491.      else if (fOutputType != OutputType_None)
  492.     {
  493.         if (fInExtSubset)
  494.             return;
  495.         if (fIntDTDOutput)
  496.         {
  497.             cout << StrX(attDef.getFullName()) << " ";
  498.             if (attDef.getType() == XMLAttDef::Enumeration)
  499.             {
  500.                 cout << '(';
  501.                 StrX tmpStr(attDef.getEnumeration());
  502.                 const char* curCh = tmpStr.localForm();
  503.                 while (*curCh)
  504.                 {
  505.                     while (!isspace(*curCh) && *curCh)
  506.                         cout << *curCh++;
  507.                     if (*curCh)
  508.                     {
  509.                         cout << '|';
  510.                         curCh++;
  511.                     }
  512.                 }
  513.                 cout << ')';
  514.             }
  515.              else
  516.             {
  517.                 cout << StrX(XMLAttDef::getAttTypeString(attDef.getType()));
  518.             }
  519.             if (XMLString::stringLen(attDef.getValue()))
  520.                 cout << " "" << StrX(attDef.getValue()) << '"';
  521.             if (attDef.getDefaultType() != XMLAttDef::Default)
  522.             {
  523.                 cout << " "
  524.                      << StrX(XMLAttDef::getDefAttTypeString(attDef.getDefaultType()));
  525.             }
  526.         }
  527.     }
  528. }
  529. void TestParser::doctypeComment(const XMLCh* const comment)
  530. {
  531.     if (fOutputType == OutputType_Debug)
  532.     {
  533.         cout << "Got DTD COMMENT:n    "
  534.              << "Text: "" << StrX(comment) << ""n"
  535.              << "    SrcOfs: " << fScanner->getSrcOffset()
  536.              << "n" << endl;
  537.     }
  538.      else if (fOutputType != OutputType_None)
  539.     {
  540.         if (fInExtSubset)
  541.             return;
  542.         if (fIntDTDOutput)
  543.             cout << "<!--" << StrX(comment) << "-->";
  544.     }
  545. }
  546. void TestParser::doctypeDecl(const  DTDElementDecl& elemDecl
  547.                             , const XMLCh* const    publicId
  548.                             , const XMLCh* const    systemId
  549.                             , const bool            hasIntSubset)
  550. {
  551.     if (fOutputType == OutputType_Debug)
  552.     {
  553.         cout << "Got DOCTYPE:n    "
  554.                 << "Root: " << StrX(elemDecl.getFullName());
  555.         if (XMLString::stringLen(publicId))
  556.             cout << ", PUBLIC: " << StrX(publicId);
  557.         if (XMLString::stringLen(systemId))
  558.             cout << ", SYSTEM: " << StrX(systemId);
  559.         cout << "n    SrcOfs: " << fScanner->getSrcOffset()
  560.              << "n" << endl;
  561.     }
  562.      else if (fOutputType != OutputType_None)
  563.     {
  564.         if (fIntDTDOutput)
  565.         {
  566.             cout << "<!DOCTYPE " << StrX(elemDecl.getFullName());
  567.             showIds(publicId, systemId);
  568.             if (!hasIntSubset)
  569.                 cout << ">";
  570.         }
  571.     }
  572. }
  573. void TestParser::doctypePI( const   XMLCh* const    target
  574.                             , const XMLCh* const    data)
  575. {
  576.     if (fOutputType == OutputType_Debug)
  577.     {
  578.         cout << "Got DTD PI:n     "
  579.                 << "Target: "" << StrX(target) << '"';
  580.         if (XMLString::stringLen(data))
  581.             cout << ", Data: "" << StrX(data) << '"';
  582.         cout << "    SrcOfs: " << fScanner->getSrcOffset()
  583.              << "n" << endl;
  584.     }
  585.      else if (fOutputType != OutputType_None)
  586.     {
  587.         if (fInExtSubset)
  588.             return;
  589.         if (fIntDTDOutput)
  590.         {
  591.             cout << "<?" << target;
  592.             if (XMLString::stringLen(data))
  593.                 cout << " " << StrX(data);
  594.             cout << "?>";
  595.         }
  596.     }
  597. }
  598. void TestParser::doctypeWhitespace( const   XMLCh* const    chars
  599.                                     , const unsigned int    length)
  600. {
  601.     if (fOutputType == OutputType_Debug)
  602.     {
  603.         cout << "Got DTD Spaces:n    Bytes: "
  604.              << length << "n"
  605.              << "    SrcOfs: " << fScanner->getSrcOffset()
  606.              << "n" << endl;
  607.     }
  608.      else if (fOutputType != OutputType_None)
  609.     {
  610.         if (fInExtSubset)
  611.             return;
  612.         if (fIntDTDOutput)
  613.             showChars(chars, length);
  614.     }
  615. }
  616. void TestParser::elementDecl(const  DTDElementDecl&     decl
  617.                             , const bool                isIgnored)
  618. {
  619.     if (fOutputType == OutputType_Debug)
  620.     {
  621.         cout << "Got ELEMENT DECL:n    "
  622.              << "Name: " << StrX(decl.getFullName());
  623.         if (isIgnored)
  624.             cout << " (Ignored)";
  625.         cout << ", Content: "
  626.              << StrX(decl.getFormattedContentModel())
  627.              << "n    SrcOfs: " << fScanner->getSrcOffset()
  628.              << "n" << endl;
  629.     }
  630.      else if (fOutputType != OutputType_None)
  631.     {
  632.         if (fInExtSubset)
  633.             return;
  634.         if (fIntDTDOutput)
  635.         {
  636.             cout << "<!ELEMENT " << StrX(decl.getFullName()) << " "
  637.                  << StrX(decl.getFormattedContentModel())
  638.                  << ">";
  639.         }
  640.     }
  641. }
  642. void TestParser::endAttList(const DTDElementDecl& elemDecl)
  643. {
  644.     if (fOutputType == OutputType_Debug)
  645.     {
  646.         cout << "Got ENDATTLIST:n    "
  647.              << "Name: " << StrX(elemDecl.getFullName()) << "n"
  648.              << "    SrcOfs: " << fScanner->getSrcOffset()
  649.              << "n" << endl;
  650.     }
  651.      else if (fOutputType != OutputType_None)
  652.     {
  653.         if (fInExtSubset)
  654.             return;
  655.         if (fIntDTDOutput)
  656.             cout << ">";
  657.     }
  658. }
  659. void TestParser::endIntSubset()
  660. {
  661.     if (fOutputType == OutputType_Debug)
  662.     {
  663.         cout << "Got ENDINTSUBSETn"
  664.              << "    SrcOfs: " << fScanner->getSrcOffset()
  665.              << "n" << endl;
  666.     }
  667.      else if (fOutputType != OutputType_None)
  668.     {
  669.         if (fIntDTDOutput)
  670.             cout << "]>";
  671.     }
  672. }
  673. void TestParser::endExtSubset()
  674. {
  675.     fInExtSubset = false;
  676.     if (fOutputType == OutputType_Debug)
  677.         cout << "Got ENDEXTSUBSETn" << endl;
  678. }
  679. void TestParser::entityDecl(const   DTDEntityDecl&  entityDecl
  680.                             , const bool            isPEDecl
  681.                             , const bool            isIgnored)
  682. {
  683.     if (fOutputType == OutputType_Debug)
  684.     {
  685.         cout << "Got ENTITYDECL:n    "
  686.              << "Name: " << StrX(entityDecl.getName())
  687.              << (isPEDecl ? " [Parameter Entity]" : " [General Entity]")
  688.              << "n" << endl;
  689.     }
  690.      else if (fOutputType != OutputType_None)
  691.     {
  692.         if (fInExtSubset)
  693.             return;
  694.         if (fIntDTDOutput)
  695.         {
  696.             cout << "<!ENTITY ";
  697.             if (isPEDecl)
  698.                 cout << "% ";
  699.             cout << StrX(entityDecl.getName());
  700.             if (entityDecl.isExternal())
  701.                 showIds(entityDecl.getPublicId(), entityDecl.getSystemId());
  702.              else
  703.                 cout << " "" << StrX(entityDecl.getValue()) << """;
  704.             cout << ">";
  705.         }
  706.     }
  707. }
  708. void TestParser::resetDocType()
  709. {
  710.     if (fOutputType == OutputType_Debug)
  711.         cout << "Got RESETDOCTYPE:n" << endl;
  712. }
  713. void TestParser::notationDecl(  const   XMLNotationDecl&    notDecl
  714.                                 , const bool                isIgnored)
  715. {
  716.     if (fOutputType == OutputType_Debug)
  717.     {
  718.         cout << "Got NOTATIONDECL:n    "
  719.              << "Name: " << StrX(notDecl.getName())
  720.              << endl;
  721.     }
  722.      else if (fOutputType != OutputType_None)
  723.     {
  724.         if (fInExtSubset)
  725.             return;
  726.         if (fIntDTDOutput)
  727.         {
  728.             cout << "<!NOTATION " << StrX(notDecl.getName()) << " ";
  729.             if (!XMLString::stringLen(notDecl.getSystemId()))
  730.                 cout << "PUBLIC ";
  731.             else
  732.                 cout << "SYSTEM ";
  733.             if (XMLString::stringLen(notDecl.getPublicId()))
  734.                 cout << """ << StrX(notDecl.getPublicId()) << '"';
  735.             if (XMLString::stringLen(notDecl.getSystemId()))
  736.                 cout << " "" << StrX(notDecl.getSystemId()) << '"';
  737.             cout << ">";
  738.         }
  739.     }
  740. }
  741. void TestParser::startAttList(const DTDElementDecl& elemDecl)
  742. {
  743.     if (fOutputType == OutputType_Debug)
  744.     {
  745.         cout << "Got STARTATTLIST:n    "
  746.                 << "Name: " << StrX(elemDecl.getFullName())
  747.                 << "n" << endl;
  748.     }
  749.      else if (fOutputType != OutputType_None)
  750.     {
  751.         if (fInExtSubset)
  752.             return;
  753.         if (fIntDTDOutput)
  754.             cout << "<!ATTLIST " << StrX(elemDecl.getFullName());
  755.     }
  756. }
  757. void TestParser::startIntSubset()
  758. {
  759.     if (fOutputType == OutputType_Debug)
  760.     {
  761.         cout << "Got STARTINTSUBSETn" << endl;
  762.     }
  763.      else if (fOutputType != OutputType_None)
  764.     {
  765.         if (fIntDTDOutput)
  766.             cout << " [";
  767.     }
  768. }
  769. void TestParser::startExtSubset()
  770. {
  771.     fInExtSubset = true;
  772.     if (fOutputType == OutputType_Debug)
  773.         cout << "Got STARTEXTSUBSETn" << endl;
  774. }
  775. void TestParser::TextDecl(  const   XMLCh* const    versionStr
  776.                             , const XMLCh* const    encodingStr)
  777. {
  778.     if (fOutputType == OutputType_Debug)
  779.     {
  780.         cout << "Got TEXTDECL:n    ";
  781.         if (XMLString::stringLen(versionStr))
  782.             cout << "Version: " << StrX(versionStr);
  783.         if (XMLString::stringLen(encodingStr))
  784.             cout << "Encoding: " << StrX(encodingStr);
  785.         cout << "n" << endl;
  786.     }
  787. }
  788. // ---------------------------------------------------------------------------
  789. //  TestParser: Implementation of the XMLErrorReporter interface
  790. // ---------------------------------------------------------------------------
  791. void TestParser::error( const   unsigned int                errCode
  792.                         , const XMLCh* const                msgDomain
  793.                         , const XMLErrorReporter::ErrTypes  type
  794.                         , const XMLCh* const                text
  795.                         , const XMLCh* const                systemId
  796.                         , const XMLCh* const                publicId
  797.                         , const unsigned int                lineNum
  798.                         , const unsigned int                colNum)
  799. {
  800.     //
  801.     //  If we are in 'show error loc' mode, then we do a special, condensed
  802.     //  display of error location info. Else we fall through and do the
  803.     //  normal one for human consumption.
  804.     //
  805.     if (fShowErrLoc)
  806.     {
  807.         // We only do fatal and validity errors in this case
  808.         if (type == XMLErrorReporter::ErrType_Warning)
  809.             return;
  810.         //
  811.         //  We want to display the entity name, but not the whole path, since
  812.         //  this output is for regression testing and has to be compared
  813.         //  against previous runs potentitally on other machines.
  814.         //
  815.         const XMLCh* entName = systemId;
  816.         int ofs = XMLString::lastIndexOf(systemId, chForwardSlash);
  817.         if (ofs == -1)
  818.             ofs = XMLString::lastIndexOf(systemId, chBackSlash);
  819.         if (ofs != -1)
  820.             entName = &systemId[ofs + 1];
  821.         cout << lineNum << "/" << colNum
  822.                 << ":" << StrX(entName)
  823.                 << " - " << StrX(text)
  824.                 << endl;
  825.         return;
  826.     }
  827.     // If its a warning and we are not showing warnings, then get out
  828.     if ((type == XMLErrorReporter::ErrType_Warning) && !fShowWarnings)
  829.         return;
  830.     const char* typeStr = "?";
  831.     if (type == XMLErrorReporter::ErrType_Fatal)
  832.         typeStr = "ERROR";
  833.     else if (type == XMLErrorReporter::ErrType_Warning)
  834.         typeStr = "WARNING";
  835.     else if (type == XMLErrorReporter::ErrType_Error)
  836.         typeStr = "VALIDITY";
  837.     // Output the error heading and the error type string
  838.     cout << "nError: (" << typeStr;
  839.     // If we have either id, display them
  840.     if (XMLString::stringLen(systemId))
  841.          cout << ", System Id: " << StrX(systemId);
  842.     if (XMLString::stringLen(publicId))
  843.         cout << ", Public Id: " << StrX(publicId);
  844.     // Display the position information
  845.     cout << ", Line/Col: " << lineNum << "/" << colNum
  846.          << ")n";
  847.     // And finally the error text
  848.     cout << StrX(text) << endl;
  849. }
  850. void TestParser::resetErrors()
  851. {
  852.     if (fOutputType == OutputType_Debug)
  853.         cout << "Got RESETERRORS:n" << endl;
  854. }
  855. // ---------------------------------------------------------------------------
  856. //  TestParser: Private helpers
  857. // ---------------------------------------------------------------------------
  858. void TestParser::showChars( const   XMLCh* const    chars
  859.                             , const unsigned int    length)
  860. {
  861.     static const XMLByte FirstByteMark[7] =
  862.     {
  863.         0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC
  864.     };
  865.     const bool doCan = ((fOutputType == OutputType_SunCanon)
  866.                         || (fOutputType == OutputType_JCCanon));
  867.     unsigned int index = 0;
  868.     while (index < length)
  869.     {
  870.         //
  871.         //  Convert the char to UTF-8 format. This will generate multiple
  872.         //  short chars to display. For each one, call the showChar()
  873.         //  method to display it.
  874.         //
  875.         XMLUInt32 tmpVal = chars[index++];
  876.         if ((tmpVal >= 0xD800) && (tmpVal <= 0xDBFF))
  877.         {
  878.             if (index == length)
  879.             {
  880.                 cout << "Missing trailing surrogaten" << endl;
  881.                 break;
  882.             }
  883.             tmpVal = ((tmpVal - 0xD800) << 10)
  884.                      + ((chars[index] - 0xDC00) + 0x10000);
  885.             index++;
  886.         }
  887.         // Figure out how many bytes we'll kick out
  888.         unsigned int outBytes;
  889.         if (tmpVal < 0x80)
  890.             outBytes = 1;
  891.         else if (tmpVal < 0x800)
  892.             outBytes = 2;
  893.         else if (tmpVal < 0x10000)
  894.             outBytes = 3;
  895.         else if (tmpVal < 0x200000)
  896.             outBytes = 4;
  897.         else if (tmpVal < 0x4000000)
  898.             outBytes = 5;
  899.         else
  900.         {
  901.             outBytes = 6;
  902.             if (tmpVal & 0x80000000)
  903.             {
  904.                 outBytes = 2;
  905.                 tmpVal = 0xFFFD;
  906.             }
  907.         }
  908.         // Get the chars into a temp buffer in the right order
  909.         char tmpOutChars[6];
  910.         unsigned int outIndex = outBytes;
  911.         switch(outBytes)
  912.         {
  913.             case 6 : tmpOutChars[--outIndex] = char((tmpVal | 0x80) & 0xBF);
  914.                      tmpVal >>= 6;
  915.             case 5 : tmpOutChars[--outIndex] = char((tmpVal | 0x80) & 0xBF);
  916.                      tmpVal >>= 6;
  917.             case 4 : tmpOutChars[--outIndex] = char((tmpVal | 0x80) & 0xBF);
  918.                      tmpVal >>= 6;
  919.             case 3 : tmpOutChars[--outIndex] = char((tmpVal | 0x80) & 0xBF);
  920.                      tmpVal >>= 6;
  921.             case 2 : tmpOutChars[--outIndex] = char((tmpVal | 0x80) & 0xBF);
  922.                      tmpVal >>= 6;
  923.             case 1 : tmpOutChars[--outIndex] = char(tmpVal | FirstByteMark[outBytes]);
  924.         }
  925.         // And spit them out
  926.         for (outIndex = 0; outIndex < outBytes; outIndex++)
  927.             showChar(tmpOutChars[outIndex], doCan);
  928.     }
  929. }
  930. void TestParser::showChar(const char toShow, const bool doCan)
  931. {
  932.     if (doCan)
  933.     {
  934.         if (toShow == chLF)
  935.             cout << "&#10;";
  936.         else if (toShow == chHTab)
  937.             cout << "&#9;";
  938.         else if (toShow == chCR)
  939.             cout << "&#13;";
  940.         else if (toShow == chSingleQuote)
  941.             cout << "&apos;";
  942.         else if (toShow == chAmpersand)
  943.             cout << "&amp;";
  944.         else if (toShow == chDoubleQuote)
  945.             cout << "&quot;";
  946.         else if (toShow == chOpenAngle)
  947.             cout << "&lt;";
  948.         else if (toShow == chCloseAngle)
  949.             cout << "&gt;";
  950.         else
  951.             cout << toShow;
  952.     }
  953.      else
  954.     {
  955.         cout << toShow;
  956.     }
  957. }
  958. void
  959. TestParser::showIds(const XMLCh* const publicId, const XMLCh* const systemId)
  960. {
  961.     if (XMLString::stringLen(publicId) || XMLString::stringLen(systemId))
  962.     {
  963.         if (!XMLString::stringLen(publicId))
  964.         {
  965.             cout << " SYSTEM '" << StrX(systemId) << "'";
  966.         }
  967.          else
  968.         {
  969.             cout << " PUBLIC '" << StrX(publicId) << "'";
  970.             if (systemId)
  971.                 cout << " '" << StrX(systemId) << "'";
  972.         }
  973.     }
  974. }
  975. void TestParser::showString(const XMLCh* const toShow)
  976. {
  977.     showChars(toShow, XMLString::stringLen(toShow));
  978. }