XMLReader.hpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:28k
源码类别:

xml/soap/webservice

开发平台:

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