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

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2001 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: XMLReader.hpp,v $
  58.  * Revision 1.14  2003/05/16 21:36:58  knoaman
  59.  * Memory manager implementation: Modify constructors to pass in the memory manager.
  60.  *
  61.  * Revision 1.13  2003/05/15 18:26:29  knoaman
  62.  * Partial implementation of the configurable memory manager.
  63.  *
  64.  * Revision 1.12  2003/01/27 16:50:27  knoaman
  65.  * some cleanup.
  66.  *
  67.  * Revision 1.11  2002/12/20 22:09:56  tng
  68.  * XML 1.1
  69.  *
  70.  * Revision 1.10  2002/12/11 22:09:08  knoaman
  71.  * Performance: reduce instructions count.
  72.  *
  73.  * Revision 1.9  2002/12/03 15:31:19  knoaman
  74.  * Enable/disable calculation of src offset.
  75.  *
  76.  * Revision 1.8  2002/12/02 17:20:05  knoaman
  77.  * Remove unused data member.
  78.  *
  79.  * Revision 1.7  2002/11/28 19:19:12  knoaman
  80.  * Performance: remove unnecessary if condition.
  81.  *
  82.  * Revision 1.6  2002/11/28 18:17:22  knoaman
  83.  * Performance: make getNextChar/peekNextChar inline.
  84.  *
  85.  * Revision 1.5  2002/11/25 21:31:08  tng
  86.  * Performance:
  87.  * 1. use XMLRecognizer::Encodings enum to make new transcode, faster than comparing the encoding string every time.
  88.  * 2. Pre uppercase the encodingString before calling encodingForName to avoid calling compareIString
  89.  *
  90.  * Revision 1.4  2002/11/04 14:58:19  tng
  91.  * C++ Namespace Support.
  92.  *
  93.  * Revision 1.3  2002/09/27 12:56:23  tng
  94.  * [Bug 12740] Extra include.  By Peter Volchek.
  95.  *
  96.  * Revision 1.2  2002/05/27 18:42:14  tng
  97.  * To get ready for 64 bit large file, use XMLSSize_t to represent line and column number.
  98.  *
  99.  * Revision 1.1.1.1  2002/02/01 22:22:02  peiyongz
  100.  * sane_include
  101.  *
  102.  * Revision 1.18  2001/12/06 17:47:04  tng
  103.  * Performance Enhancement.  Modify the handling of the fNEL option so that it results in fgCharCharsTable being modified, instead of having all of the low-level routines check the option.  This seemed acceptable because the code appears to only permit the option to be turned on and not turned off again.   By Henry Zongaro.
  104.  *
  105.  * Revision 1.17  2001/07/12 18:50:13  tng
  106.  * Some performance modification regarding standalone check and xml decl check.
  107.  *
  108.  * Revision 1.16  2001/05/11 13:26:17  tng
  109.  * Copyright update.
  110.  *
  111.  * Revision 1.15  2001/05/03 18:42:51  knoaman
  112.  * Added new option to the parsers so that the NEL (0x85) char can be treated as a newline character.
  113.  *
  114.  * Revision 1.14  2001/01/25 19:16:58  tng
  115.  * const should be used instead of static const.  Fixed by Khaled Noaman.
  116.  *
  117.  * Revision 1.13  2000/07/25 22:33:05  aruna1
  118.  * Char definitions in XMLUni moved to XMLUniDefs
  119.  *
  120.  * Revision 1.12  2000/07/08 00:17:13  andyh
  121.  * Cleanup of yesterday's speedup changes.  Merged new bit into the
  122.  * scanner character properties table.
  123.  *
  124.  * Revision 1.11  2000/07/07 01:08:44  andyh
  125.  * Parser speed up in scan of XML content.
  126.  *
  127.  * Revision 1.10  2000/07/06 21:00:52  jpolast
  128.  * inlined getNextCharIfNot() for better performance
  129.  *
  130.  * Revision 1.9  2000/05/11 23:11:33  andyh
  131.  * Add missing validity checks for stand-alone documents, character range
  132.  * and Well-formed parsed entities.  Changes contributed by Sean MacRoibeaird
  133.  * <sean.Macroibeaird@ireland.sun.com>
  134.  *
  135.  * Revision 1.8  2000/03/02 19:54:29  roddey
  136.  * This checkin includes many changes done while waiting for the
  137.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  138.  * available elsewhere.
  139.  *
  140.  * Revision 1.7  2000/02/24 20:18:07  abagchi
  141.  * Swat for removing Log from API docs
  142.  *
  143.  * Revision 1.6  2000/02/06 07:47:53  rahulj
  144.  * Year 2K copyright swat.
  145.  *
  146.  * Revision 1.5  2000/01/25 01:04:21  roddey
  147.  * Fixes a bogus error about ]]> in char data.
  148.  *
  149.  * Revision 1.4  2000/01/22 00:01:08  roddey
  150.  * Simple change to get rid of two hard coded 'x' type characters, which won't
  151.  * work on EBCDIC systems.
  152.  *
  153.  * Revision 1.3  1999/12/18 00:20:00  roddey
  154.  * More changes to support the new, completely orthagonal, support for
  155.  * intrinsic encodings.
  156.  *
  157.  * Revision 1.2  1999/12/15 19:48:03  roddey
  158.  * Changed to use new split of transcoder interfaces into XML transcoders and
  159.  * LCP transcoders, and implementation of intrinsic transcoders as pluggable
  160.  * transcoders, and addition of Latin1 intrinsic support.
  161.  *
  162.  * Revision 1.1.1.1  1999/11/09 01:08:22  twl
  163.  * Initial checkin
  164.  *
  165.  * Revision 1.3  1999/11/08 20:44:47  rahul
  166.  * Swat for adding in Product name and CVS comment log variable.
  167.  *
  168.  */
  169. #if !defined(XMLREADER_HPP)
  170. #define XMLREADER_HPP
  171. #include <xercesc/util/XMLChar.hpp>
  172. #include <xercesc/framework/XMLRecognizer.hpp>
  173. #include <xercesc/framework/XMLBuffer.hpp>
  174. XERCES_CPP_NAMESPACE_BEGIN
  175. class InputSource;
  176. class BinInputStream;
  177. class ReaderMgr;
  178. class XMLScanner;
  179. class XMLTranscoder;
  180. // ---------------------------------------------------------------------------
  181. //  Instances of this class are used to manage the content of entities. The
  182. //  scanner maintains a stack of these, one for each entity (this means entity
  183. //  in the sense of any parsed file or internal entity) currently being
  184. //  scanned. This class, given a binary input stream will handle reading in
  185. //  the data and decoding it from its external decoding into the internal
  186. //  Unicode format. Once internallized, this class provides the access
  187. //  methods to read in the data in various ways, maintains line and column
  188. //  information, and provides high performance character attribute checking
  189. //  methods.
  190. //
  191. //  This is NOT to be derived from.
  192. //
  193. // ---------------------------------------------------------------------------
  194. class XMLPARSER_EXPORT XMLReader : public XMemory
  195. {
  196. public:
  197.     // -----------------------------------------------------------------------
  198.     //  Public types
  199.     // -----------------------------------------------------------------------
  200.     enum Types
  201.     {
  202.         Type_PE
  203.         , Type_General
  204.     };
  205.     enum Sources
  206.     {
  207.         Source_Internal
  208.         , Source_External
  209.     };
  210.     enum RefFrom
  211.     {
  212.         RefFrom_Literal
  213.         , RefFrom_NonLiteral
  214.     };
  215.     enum XMLVersion
  216.     {
  217.         XMLV1_0
  218.         , XMLV1_1
  219.         , XMLV_Unknown
  220.     };
  221.     // -----------------------------------------------------------------------
  222.     //  Public, query methods
  223.     // -----------------------------------------------------------------------
  224.     bool isAllSpaces
  225.     (
  226.         const   XMLCh* const    toCheck
  227.         , const unsigned int    count
  228.     );
  229.     bool containsWhiteSpace
  230.     (
  231.         const   XMLCh* const    toCheck
  232.         , const unsigned int    count
  233.     );
  234.     bool isXMLLetter(const XMLCh toCheck);
  235.     bool isFirstNameChar(const XMLCh toCheck);
  236.     bool isNameChar(const XMLCh toCheck);
  237.     bool isPlainContentChar(const XMLCh toCheck);
  238.     bool isSpecialStartTagChar(const XMLCh toCheck);
  239.     bool isXMLChar(const XMLCh toCheck);
  240.     bool isWhitespace(const XMLCh toCheck);
  241.     bool isControlChar(const XMLCh toCheck);
  242.     bool isPublicIdChar(const XMLCh toCheck);
  243.     // -----------------------------------------------------------------------
  244.     //  Constructors and Destructor
  245.     // -----------------------------------------------------------------------
  246.     XMLReader
  247.     (
  248.         const   XMLCh* const          pubId
  249.         , const XMLCh* const          sysId
  250.         ,       BinInputStream* const streamToAdopt
  251.         , const RefFrom               from
  252.         , const Types                 type
  253.         , const Sources               source
  254.         , const bool                  throwAtEnd = false
  255.         , const bool                  calculateSrcOfs = true
  256.         , const XMLVersion            xmlVersion = XMLV1_0
  257.         ,       MemoryManager* const  manager = XMLPlatformUtils::fgMemoryManager
  258.     );
  259.     XMLReader
  260.     (
  261.         const   XMLCh* const          pubId
  262.         , const XMLCh* const          sysId
  263.         ,       BinInputStream* const streamToAdopt
  264.         , const XMLCh* const          encodingStr
  265.         , const RefFrom               from
  266.         , const Types                 type
  267.         , const Sources               source
  268.         , const bool                  throwAtEnd = false
  269.         , const bool                  calculateSrcOfs = true
  270.         , const XMLVersion            xmlVersion = XMLV1_0
  271.         ,       MemoryManager* const  manager = XMLPlatformUtils::fgMemoryManager
  272.     );
  273.     XMLReader
  274.     (
  275.         const   XMLCh* const          pubId
  276.         , const XMLCh* const          sysId
  277.         ,       BinInputStream* const streamToAdopt
  278.         , XMLRecognizer::Encodings    encodingEnum
  279.         , const RefFrom               from
  280.         , const Types                 type
  281.         , const Sources               source
  282.         , const bool                  throwAtEnd = false
  283.         , const bool                  calculateSrcOfs = true
  284.         , const XMLVersion            xmlVersion = XMLV1_0
  285.         ,       MemoryManager* const  manager = XMLPlatformUtils::fgMemoryManager
  286.     );
  287.     ~XMLReader();
  288.     // -----------------------------------------------------------------------
  289.     //  Character buffer management methods
  290.     // -----------------------------------------------------------------------
  291.     unsigned long charsLeftInBuffer() const;
  292.     bool refreshCharBuffer();
  293.     // -----------------------------------------------------------------------
  294.     //  Scanning methods
  295.     // -----------------------------------------------------------------------
  296.     bool getName(XMLBuffer& toFill, const bool token);
  297.     bool getNextChar(XMLCh& chGotten);
  298.     bool getNextCharIfNot(const XMLCh chNotToGet, XMLCh& chGotten);
  299.     void movePlainContentChars(XMLBuffer &dest);
  300.     bool getSpaces(XMLBuffer& toFill);
  301.     bool getUpToCharOrWS(XMLBuffer& toFill, const XMLCh toCheck);
  302.     bool peekNextChar(XMLCh& chGotten);
  303.     bool skipIfQuote(XMLCh& chGotten);
  304.     bool skipSpaces(bool& skippedSomething);
  305.     bool skippedChar(const XMLCh toSkip);
  306.     bool skippedSpace();
  307.     bool skippedString(const XMLCh* const toSkip);
  308.     bool peekString(const XMLCh* const toPeek);
  309.     // -----------------------------------------------------------------------
  310.     //  Getter methods
  311.     // -----------------------------------------------------------------------
  312.     XMLSSize_t getColumnNumber() const;
  313.     const XMLCh* getEncodingStr() const;
  314.     XMLSSize_t getLineNumber() const;
  315.     bool getNoMoreFlag() const;
  316.     const XMLCh* getPublicId() const;
  317.     unsigned int getReaderNum() const;
  318.     RefFrom getRefFrom() const;
  319.     Sources getSource() const;
  320.     unsigned int getSrcOffset() const;
  321.     const XMLCh* getSystemId() const;
  322.     bool getThrowAtEnd() const;
  323.     Types getType() const;
  324.     // -----------------------------------------------------------------------
  325.     //  Setter methods
  326.     // -----------------------------------------------------------------------
  327.     bool setEncoding
  328.     (
  329.         const   XMLCh* const    newEncoding
  330.     );
  331.     void setReaderNum(const unsigned int newNum);
  332.     void setThrowAtEnd(const bool newValue);
  333.     void setXMLVersion(const XMLVersion version);
  334. private:
  335.     // ---------------------------------------------------------------------------
  336.     //  Class Constants
  337.     //
  338.     //  kCharBufSize
  339.     //      The size of the character spool buffer that we use. Its not terribly
  340.     //      large because its just getting filled with data from a raw byte
  341.     //      buffer as we go along. We don't want to decode all the text at
  342.     //      once before we find out that there is an error.
  343.     //
  344.     //      NOTE: This is a size in characters, not bytes.
  345.     //
  346.     //  kRawBufSize
  347.     //      The size of the raw buffer from which raw bytes are spooled out
  348.     //      as we transcode chunks of data. As it is emptied, it is filled back
  349.     //      in again from the source stream.
  350.     // ---------------------------------------------------------------------------
  351.     enum Constants
  352.     {
  353.         kCharBufSize        = 16 * 1024
  354.         , kRawBufSize       = 48 * 1024
  355.     };
  356.     // -----------------------------------------------------------------------
  357.     //  Private helper methods
  358.     // -----------------------------------------------------------------------
  359.     void checkForSwapped();
  360.     void doInitCharSizeChecks();
  361.     void doInitDecode();
  362.     XMLByte getNextRawByte
  363.     (
  364.         const   bool            eoiOk
  365.     );
  366.     void refreshRawBuffer();
  367.     void setTranscoder
  368.     (
  369.         const   XMLCh* const    newEncoding
  370.     );
  371.     unsigned int xcodeMoreChars
  372.     (
  373.                 XMLCh* const            bufToFill
  374.         ,       unsigned char* const    charSizes
  375.         , const unsigned int            maxChars
  376.     );
  377.     // -----------------------------------------------------------------------
  378.     //  Data members
  379.     //
  380.     //  fCharIndex
  381.     //      The index into the character buffer. When this hits fCharsAvail
  382.     //      then its time to refill.
  383.     //
  384.     //  fCharBuf
  385.     //      A buffer that the reader manager fills up with transcoded
  386.     //      characters a small amount at a time.
  387.     //
  388.     //  fCharsAvail
  389.     //      The characters currently available in the character buffer.
  390.     //
  391.     //  fCharSizeBuf
  392.     //      This buffer is an array that contains the number of source chars
  393.     //      eaten to create each char in the fCharBuf buffer. So the entry
  394.     //      fCharSizeBuf[x] is the number of source chars that were eaten
  395.     //      to make the internalized char fCharBuf[x]. This only contains
  396.     //      useful data if fSrcOfsSupported is true.
  397.     //
  398.     //  fCurCol
  399.     //  fCurLine
  400.     //      The current line and column that we are in within this reader's
  401.     //      text.
  402.     //
  403.     //  fEncoding
  404.     //      This is the rough encoding setting. This enum is set during
  405.     //      construction and just tells us the rough family of encoding that
  406.     //      we are doing.
  407.     //
  408.     //  fEncodingStr
  409.     //      This is the name of the encoding we are using. It will be
  410.     //      provisionally set during construction, from the auto-sensed
  411.     //      encoding. But it might be overridden when the XMLDecl is finally
  412.     //      seen by the scanner. It can also be forced to a particular
  413.     //      encoding, in which case fForcedEncoding is set.
  414.     //
  415.     //  fForcedEncoding
  416.     //      If the encoding if forced then this is set and all other
  417.     //      information will be ignored. This encoding will be taken as
  418.     //      gospel. This is done by calling an alternate constructor.
  419.     //
  420.     //  fNoMore
  421.     //      This is set when the source text is exhausted. It lets us know
  422.     //      quickly that no more text is available.
  423.     //
  424.     //  fRawBufIndex
  425.     //      The current index into the raw byte buffer. When its equal to
  426.     //      fRawBytesAvail then we need to read another buffer.
  427.     //
  428.     //  fRawByteBuf
  429.     //      This is the raw byte buffer that is used to spool out bytes
  430.     //      from into the fCharBuf buffer, as we transcode in blocks.
  431.     //
  432.     //  fRawBytesAvail
  433.     //      The number of bytes currently available in the raw buffer. This
  434.     //      helps deal with the last buffer's worth, which will usually not
  435.     //      be a full one.
  436.     //
  437.     //  fReaderNum
  438.     //      Each reader from a particular reader manager (which means from a
  439.     //      particular document) is given a unique number. The reader manager
  440.     //      sets these numbers. They are used to catch things like partial
  441.     //      markup errors.
  442.     //
  443.     //  fRefFrom
  444.     //      This flag is provided in the ctor, and tells us if we represent
  445.     //      some entity being expanded inside a literal. Sometimes things
  446.     //      happen differently inside and outside literals.
  447.     //
  448.     //  fPublicId
  449.     //  fSystemId
  450.     //      These are the system and public ids of the source that this
  451.     //      reader is reading.
  452.     //
  453.     //  fSentTrailingSpace
  454.     //      If we are a PE entity being read and we not referenced from a
  455.     //      literal, then a leading and trailing space must be faked into the
  456.     //      data. This lets us know we've done the trailing space already (so
  457.     //      we don't just keep doing it again and again.)
  458.     //
  459.     //  fSource
  460.     //      Indicates whether the content this reader is spooling as already
  461.     //      been internalized. This will prevent multiple processing of
  462.     //      whitespace when an already internalized entity is being spooled
  463.     //      out.
  464.     //
  465.     //  fSpareChar
  466.     //      Some encodings can create two chars in an atomic way, e.g.
  467.     //      surrogate pairs. We might not be able to store both, so we store
  468.     //      it here until the next buffer transcoding operation.
  469.     //
  470.     //  fSrcOfsBase
  471.     //      This is the base offset within the source of this entity. Values
  472.     //      in the curent fCharSizeBuf array are relative to this value.
  473.     //
  474.     //  fSrcOfsSupported
  475.     //      This flag is set to indicate whether source byte offset info
  476.     //      is supported. For intrinsic encodings, its always set since we
  477.     //      can always support it. For transcoder based encodings, we ask
  478.     //      the transcoder if it supports it or not.
  479.     //
  480.     //  fStream
  481.     //      This is the input stream that provides the data for the reader.
  482.     //      Its always treated as a raw byte stream. The derived class will
  483.     //      ask for buffers of text from it and will handle making some
  484.     //      sense of it.
  485.     //
  486.     //  fSwapped
  487.     //      If the encoding is one of the ones we do intrinsically, and its
  488.     //      in a different byte order from our native order, then this is
  489.     //      set to remind us to byte swap it during transcoding.
  490.     //
  491.     //  fThrowAtEnd
  492.     //      Indicates whether the reader manager should throw an end of entity
  493.     //      exception at the end of this reader instance. This is usually
  494.     //      set for top level external entity references. It overrides the
  495.     //      reader manager's global flag that controls throwing at the end
  496.     //      of entities. Defaults to false.
  497.     //
  498.     //  fTranscoder
  499.     //      If the encoding is not one that we handle intrinsically, then
  500.     //      we use an an external transcoder to do it. This class is an
  501.     //      abstraction that allows us to use pluggable external transcoding
  502.     //      services (via XMLTransService in util.)
  503.     //
  504.     //  fType
  505.     //      Indicates whether this reader represents a PE or not. If this
  506.     //      flag is true and the fInLiteral flag is false, then we will put
  507.     //      out an extra space at the end.
  508.     //
  509.     //  fgCharCharsTable;
  510.     //      Pointer to XMLChar table, depends on XML version
  511.     //
  512.     //  fNEL
  513.     //      Boolean indicates if NEL and LSEP should be recognized as NEL
  514.     //
  515.     //  fXMLVersion
  516.     //      Enum to indicate if this Reader is conforming to XML 1.0 or XML 1.1
  517.     // -----------------------------------------------------------------------
  518.     unsigned int                fCharIndex;
  519.     XMLCh                       fCharBuf[kCharBufSize];
  520.     unsigned int                fCharsAvail;
  521.     unsigned char               fCharSizeBuf[kCharBufSize];
  522.     XMLSSize_t                  fCurCol;
  523.     XMLSSize_t                  fCurLine;
  524.     XMLRecognizer::Encodings    fEncoding;
  525.     XMLCh*                      fEncodingStr;
  526.     bool                        fForcedEncoding;
  527.     bool                        fNoMore;
  528.     XMLCh*                      fPublicId;
  529.     unsigned int                fRawBufIndex;
  530.     XMLByte                     fRawByteBuf[kRawBufSize];
  531.     unsigned int                fRawBytesAvail;
  532.     unsigned int                fReaderNum;
  533.     RefFrom                     fRefFrom;
  534.     bool                        fSentTrailingSpace;
  535.     Sources                     fSource;
  536.     unsigned int                fSrcOfsBase;
  537.     bool                        fSrcOfsSupported;
  538.     bool                        fCalculateSrcOfs;
  539.     XMLCh*                      fSystemId;
  540.     BinInputStream*             fStream;
  541.     bool                        fSwapped;
  542.     bool                        fThrowAtEnd;
  543.     XMLTranscoder*              fTranscoder;
  544.     Types                       fType;
  545.     XMLByte*                    fgCharCharsTable;
  546.     bool                        fNEL;
  547.     XMLVersion                  fXMLVersion;
  548.     MemoryManager*              fMemoryManager;
  549. };
  550. // ---------------------------------------------------------------------------
  551. //  XMLReader: Public, query methods
  552. // ---------------------------------------------------------------------------
  553. inline bool XMLReader::isNameChar(const XMLCh toCheck)
  554. {
  555.     return ((fgCharCharsTable[toCheck] & gNameCharMask) != 0);
  556. }
  557. inline bool XMLReader::isPlainContentChar(const XMLCh toCheck)
  558. {
  559.     return ((fgCharCharsTable[toCheck] & gPlainContentCharMask) != 0);
  560. }
  561. inline bool XMLReader::isFirstNameChar(const XMLCh toCheck)
  562. {
  563.     return ((fgCharCharsTable[toCheck] & gFirstNameCharMask) != 0);
  564. }
  565. inline bool XMLReader::isSpecialStartTagChar(const XMLCh toCheck)
  566. {
  567.     return ((fgCharCharsTable[toCheck] & gSpecialStartTagCharMask) != 0);
  568. }
  569. inline bool XMLReader::isXMLChar(const XMLCh toCheck)
  570. {
  571.     return ((fgCharCharsTable[toCheck] & gXMLCharMask) != 0);
  572. }
  573. inline bool XMLReader::isXMLLetter(const XMLCh toCheck)
  574. {
  575.     return ((fgCharCharsTable[toCheck] & gLetterCharMask) != 0);
  576. }
  577. inline bool XMLReader::isWhitespace(const XMLCh toCheck)
  578. {
  579.     return ((fgCharCharsTable[toCheck] & gWhitespaceCharMask) != 0);
  580. }
  581. inline bool XMLReader::isControlChar(const XMLCh toCheck)
  582. {
  583.     return ((fgCharCharsTable[toCheck] & gControlCharMask) != 0);
  584. }
  585. // ---------------------------------------------------------------------------
  586. //  XMLReader: Buffer management methods
  587. // ---------------------------------------------------------------------------
  588. inline unsigned long XMLReader::charsLeftInBuffer() const
  589. {
  590.     return fCharsAvail - fCharIndex;
  591. }
  592. // ---------------------------------------------------------------------------
  593. //  XMLReader: Getter methods
  594. // ---------------------------------------------------------------------------
  595. inline XMLSSize_t XMLReader::getColumnNumber() const
  596. {
  597.     return fCurCol;
  598. }
  599. inline const XMLCh* XMLReader::getEncodingStr() const
  600. {
  601.     return fEncodingStr;
  602. }
  603. inline XMLSSize_t XMLReader::getLineNumber() const
  604. {
  605.     return fCurLine;
  606. }
  607. inline bool XMLReader::getNoMoreFlag() const
  608. {
  609.     return fNoMore;
  610. }
  611. inline const XMLCh* XMLReader::getPublicId() const
  612. {
  613.     return fPublicId;
  614. }
  615. inline unsigned int XMLReader::getReaderNum() const
  616. {
  617.     return fReaderNum;
  618. }
  619. inline XMLReader::RefFrom XMLReader::getRefFrom() const
  620. {
  621.     return fRefFrom;
  622. }
  623. inline XMLReader::Sources XMLReader::getSource() const
  624. {
  625.     return fSource;
  626. }
  627. inline const XMLCh* XMLReader::getSystemId() const
  628. {
  629.     return fSystemId;
  630. }
  631. inline bool XMLReader::getThrowAtEnd() const
  632. {
  633.     return fThrowAtEnd;
  634. }
  635. inline XMLReader::Types XMLReader::getType() const
  636. {
  637.     return fType;
  638. }
  639. // ---------------------------------------------------------------------------
  640. //  XMLReader: Setter methods
  641. // ---------------------------------------------------------------------------
  642. inline void XMLReader::setReaderNum(const unsigned int newNum)
  643. {
  644.     fReaderNum = newNum;
  645. }
  646. inline void XMLReader::setThrowAtEnd(const bool newValue)
  647. {
  648.     fThrowAtEnd = newValue;
  649. }
  650. inline void XMLReader::setXMLVersion(const XMLVersion version)
  651. {
  652.     fXMLVersion = version;
  653.     if (version == XMLV1_1) {
  654.         fNEL = true;
  655.         fgCharCharsTable = XMLChar1_1::fgCharCharsTable1_1;
  656.     }
  657.     else {
  658.         fNEL = XMLChar1_0::enableNEL;
  659.         fgCharCharsTable = XMLChar1_0::fgCharCharsTable1_0;
  660.     }
  661. }
  662. // ---------------------------------------------------------------------------
  663. //
  664. //  XMLReader: movePlainContentChars()
  665. //
  666. //       Move as many plain (no special handling of any sort required) content
  667. //       characters as possible from this reader to the supplied destination buffer.
  668. //
  669. //       This is THE hottest performance spot in the parser.
  670. //
  671. // ---------------------------------------------------------------------------
  672. inline void XMLReader::movePlainContentChars(XMLBuffer &dest)
  673. {
  674.     unsigned int count = fCharIndex;
  675.     while (fCharIndex < fCharsAvail)
  676.     {
  677.         if (!isPlainContentChar(fCharBuf[fCharIndex]))
  678.             break;
  679.         fCharIndex++;
  680.     }
  681.     if (count != fCharIndex)
  682.     {
  683.         fCurCol    += (fCharIndex - count);
  684.         dest.append(&fCharBuf[count], fCharIndex - count);
  685.     }
  686. }
  687. // ---------------------------------------------------------------------------
  688. //  XMLReader: getNextCharIfNot() method inlined for speed
  689. // ---------------------------------------------------------------------------
  690. inline bool XMLReader::getNextCharIfNot(const XMLCh chNotToGet, XMLCh& chGotten)
  691. {
  692.     //
  693.     //  See if there is at least a char in the buffer. Else, do the buffer
  694.     //  reload logic.
  695.     //
  696.     if (fCharIndex >= fCharsAvail)
  697.     {
  698.         // If fNoMore is set, then we have nothing else to give
  699.         if (fNoMore)
  700.             return false;
  701.         // Try to refresh
  702.         if (!refreshCharBuffer())
  703.             return false;
  704.     }
  705.     // Check the next char
  706.     if (fCharBuf[fCharIndex] == chNotToGet)
  707.         return false;
  708.     // Its not the one we want to skip so bump the index
  709.     chGotten = fCharBuf[fCharIndex++];
  710.     // Handle end of line normalization and line/col member maintenance.
  711.     if (chGotten == chCR)
  712.     {
  713.         //
  714.         //  Do the normalization. We return chLF regardless of which was
  715.         //  found. We also eat a chCR followed by an chLF.
  716.         //
  717.         //  We only do this if the content being spooled is not already
  718.         //  internalized.
  719.         //
  720.         if (fSource == Source_External)
  721.         {
  722.             //
  723.             //  See if we have another char left. If not, don't bother.
  724.             //  Else, see if its an chLF to eat. If it is, bump the
  725.             //  index again.
  726.             //
  727.             if (fCharIndex < fCharsAvail)
  728.             {
  729.                 if (fCharBuf[fCharIndex] == chLF
  730.                     || ((fCharBuf[fCharIndex] == chNEL) && fNEL))
  731.                     fCharIndex++;
  732.             }
  733.              else
  734.             {
  735.                 if (refreshCharBuffer())
  736.                 {
  737.                     if (fCharBuf[fCharIndex] == chLF
  738.                         || ((fCharBuf[fCharIndex] == chNEL) && fNEL))
  739.                         fCharIndex++;
  740.                 }
  741.             }
  742.             // And return just an chLF
  743.             chGotten = chLF;
  744.         }
  745.         // And handle the line/col stuff
  746.         fCurCol = 1;
  747.         fCurLine++;
  748.     }
  749.      else if (chGotten == chLF
  750.               || ((chGotten == chNEL || chGotten == chLineSeparator) && fNEL))
  751.     {
  752.         chGotten = chLF;
  753.         fCurLine++;
  754.         fCurCol = 1;
  755.     }
  756.      else if (chGotten)
  757.     {
  758.         //
  759.         //  Only do this is not a null char. Null chars are not part of the
  760.         //  real content. They are just marker characters inserted into
  761.         //  the stream.
  762.         //
  763.         fCurCol++;
  764.     }
  765.     return true;
  766. }
  767. // ---------------------------------------------------------------------------
  768. //  XMLReader: getNextChar() method inlined for speed
  769. // ---------------------------------------------------------------------------
  770. inline bool XMLReader::getNextChar(XMLCh& chGotten)
  771. {
  772.     //
  773.     //  See if there is at least a char in the buffer. Else, do the buffer
  774.     //  reload logic.
  775.     //
  776.     if (fCharIndex >= fCharsAvail)
  777.     {
  778.         // If fNoMore is set, then we have nothing else to give
  779.         if (fNoMore)
  780.             return false;
  781.         // Try to refresh
  782.         if (!refreshCharBuffer())
  783.             return false;
  784.     }
  785.     chGotten = fCharBuf[fCharIndex++];
  786.     // Handle end of line normalization and line/col member maintenance.
  787.     if (chGotten == chCR)
  788.     {
  789.         //
  790.         //  Do the normalization. We return chLF regardless of which was
  791.         //  found. We also eat a chCR followed by an chLF.
  792.         //
  793.         //  We only do this if the content being spooled is not already
  794.         //  internalized.
  795.         //
  796.         if (fSource == Source_External)
  797.         {
  798.             //
  799.             //  See if we have another char left. If not, don't bother.
  800.             //  Else, see if its an chLF to eat. If it is, bump the
  801.             //  index again.
  802.             //
  803.             if ((fCharIndex < fCharsAvail) || refreshCharBuffer())
  804.             {
  805.                 if (fCharBuf[fCharIndex] == chLF
  806.                     || ((fCharBuf[fCharIndex] == chNEL) && fNEL))
  807.                     fCharIndex++;
  808.             }
  809.             // And return just an chLF
  810.             chGotten = chLF;
  811.         }
  812.         // And handle the line/col stuff
  813.         fCurCol = 1;
  814.         fCurLine++;
  815.     }
  816.      else if (chGotten == chLF
  817.               || ((chGotten == chNEL || chGotten == chLineSeparator) && fNEL))
  818.     {
  819.         chGotten = chLF;
  820.         fCurLine++;
  821.         fCurCol = 1;
  822.     }
  823.      else if (chGotten)
  824.     {
  825.         //
  826.         //  Only do this is not a null char. Null chars are not part of the
  827.         //  real content. They are just marker characters inserted into
  828.         //  the stream.
  829.         //
  830.         fCurCol++;
  831.     }
  832.     return true;
  833. }
  834. // ---------------------------------------------------------------------------
  835. //  XMLReader: peekNextChar() method inlined for speed
  836. // ---------------------------------------------------------------------------
  837. inline bool XMLReader::peekNextChar(XMLCh& chGotten)
  838. {
  839.     //
  840.     //  If there is something still in the buffer, get it. Else do the reload
  841.     //  scenario.
  842.     //
  843.     if (fCharIndex >= fCharsAvail)
  844.     {
  845.         // Try to refresh the buffer
  846.         if (!refreshCharBuffer())
  847.         {
  848.             chGotten = chNull;
  849.             return false;
  850.         }
  851.     }
  852.     chGotten = fCharBuf[fCharIndex];
  853.     //
  854.     //  Even though we are only peeking, we have to act the same as the
  855.     //  normal char get method in regards to newline normalization, though
  856.     //  its not as complicated as the actual character getting method's.
  857.     //
  858.     if ((chGotten == chCR || ((chGotten == chNEL || chGotten == chLineSeparator) && fNEL))
  859.         && (fSource == Source_External))
  860.         chGotten = chLF;
  861.     return true;
  862. }
  863. XERCES_CPP_NAMESPACE_END
  864. #endif