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

词法分析

开发平台:

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: XMLFormatter.hpp,v $
  58.  * Revision 1.14  2003/05/16 21:36:55  knoaman
  59.  * Memory manager implementation: Modify constructors to pass in the memory manager.
  60.  *
  61.  * Revision 1.13  2003/05/15 18:26:07  knoaman
  62.  * Partial implementation of the configurable memory manager.
  63.  *
  64.  * Revision 1.12  2003/03/17 03:19:52  peiyongz
  65.  * Bug#18051 memory leakage in XMLFormatter
  66.  *
  67.  * Revision 1.11  2003/03/16 06:00:43  peiyongz
  68.  * Bug#17983 Formatter does not escape control characters
  69.  *
  70.  * Revision 1.10  2003/03/11 12:58:36  tng
  71.  * Fix compilation error on AIX.
  72.  *
  73.  * Revision 1.9  2003/03/07 21:42:37  tng
  74.  * [Bug 17589] Refactoring ... .  Patch from Jacques Legare.
  75.  *
  76.  * Revision 1.8  2003/03/07 18:08:10  tng
  77.  * Return a reference instead of void for operator=
  78.  *
  79.  * Revision 1.7  2003/01/31 00:30:48  jberry
  80.  * Syntax error in declaration
  81.  *
  82.  * Revision 1.6  2003/01/28 18:32:33  peiyongz
  83.  * Bug#13694: Allow Xerces to write the BOM to XML files
  84.  *
  85.  * Revision 1.5  2003/01/24 20:20:22  tng
  86.  * Add method flush to XMLFormatTarget
  87.  *
  88.  * Revision 1.4  2002/11/04 15:00:21  tng
  89.  * C++ Namespace Support.
  90.  *
  91.  * Revision 1.3  2002/07/30 16:29:16  tng
  92.  * [Bug 8550] No explanation of XMLFormatter escape options.
  93.  *
  94.  * Revision 1.2  2002/06/21 19:31:23  peiyongz
  95.  * getTranscoder() added;
  96.  *
  97.  * Revision 1.1.1.1  2002/02/01 22:21:52  peiyongz
  98.  * sane_include
  99.  *
  100.  * Revision 1.7  2000/10/17 19:25:38  andyh
  101.  * XMLFormatTarget, removed version of writeChars with no length.  Can not be
  102.  * safely used, and obscured other errors.
  103.  *
  104.  * Revision 1.6  2000/10/10 23:54:58  andyh
  105.  * XMLFormatter patch, contributed by Bill Schindler.  Fix problems with
  106.  * output to multi-byte encodings.
  107.  *
  108.  * Revision 1.5  2000/04/07 01:01:56  roddey
  109.  * Fixed an error message so that it indicated the correct radix for the rep
  110.  * token. Get all of the basic output formatting functionality in place for
  111.  * at least ICU and Win32 transcoders.
  112.  *
  113.  * Revision 1.4  2000/04/06 23:50:38  roddey
  114.  * Now the low level formatter handles doing char refs for
  115.  * unrepresentable chars (in addition to the replacement char style
  116.  * already done.)
  117.  *
  118.  * Revision 1.3  2000/04/06 19:09:21  roddey
  119.  * Some more improvements to output formatting. Now it will correctly
  120.  * handle doing the 'replacement char' style of dealing with chars
  121.  * that are unrepresentable.
  122.  *
  123.  * Revision 1.2  2000/04/05 00:20:16  roddey
  124.  * More updates for the low level formatted output support
  125.  *
  126.  * Revision 1.1  2000/03/28 19:43:17  roddey
  127.  * Fixes for signed/unsigned warnings. New work for two way transcoding
  128.  * stuff.
  129.  *
  130.  */
  131. #if !defined(XMLFORMATTER_HPP)
  132. #define XMLFORMATTER_HPP
  133. #include <xercesc/util/PlatformUtils.hpp>
  134. XERCES_CPP_NAMESPACE_BEGIN
  135. class XMLFormatTarget;
  136. class XMLTranscoder;
  137. /**
  138.  *  This class provides the basic formatting capabilities that are required
  139.  *  to turn the Unicode based XML data from the parsers into a form that can
  140.  *  be used on non-Unicode based systems, that is, into local or generic text
  141.  *  encodings.
  142.  *
  143.  *  A number of flags are provided to control whether various optional
  144.  *  formatting operations are performed.
  145.  */
  146. class XMLPARSER_EXPORT XMLFormatter : public XMemory
  147. {
  148. public:
  149.     // -----------------------------------------------------------------------
  150.     //  Class types
  151.     // -----------------------------------------------------------------------
  152.     /** @name Public Contants */
  153.     //@{
  154.     /**
  155.      * EscapeFlags - Different styles of escape flags to control various formatting.
  156.      *
  157.      * <p><code>NoEscapes:</code>
  158.      * No character needs to be escaped.   Just write them out as is.</p>
  159.      * <p><code>StdEscapes:</code>
  160.      * The following characters need to be escaped:</p>
  161.      * <table border='1'>
  162.      * <tr>
  163.      * <td>character</td>
  164.      * <td>should be escaped and written as</td>
  165.      * </tr>
  166.      * <tr>
  167.      * <td valign='top' rowspan='1' colspan='1'>&amp;</td>
  168.      * <td valign='top' rowspan='1' colspan='1'>&amp;amp;</td>
  169.      * </tr>
  170.      * <tr>
  171.      * <td valign='top' rowspan='1' colspan='1'>&gt;</td>
  172.      * <td valign='top' rowspan='1' colspan='1'>&amp;gt;</td>
  173.      * </tr>
  174.      * <tr>
  175.      * <td valign='top' rowspan='1' colspan='1'>&quot;</td>
  176.      * <td valign='top' rowspan='1' colspan='1'>&amp;quot;</td>
  177.      * </tr>
  178.      * <tr>
  179.      * <td valign='top' rowspan='1' colspan='1'>&lt;</td>
  180.      * <td valign='top' rowspan='1' colspan='1'>&amp;lt;</td>
  181.      * </tr>
  182.      * <tr>
  183.      * <td valign='top' rowspan='1' colspan='1'>&apos;</td>
  184.      * <td valign='top' rowspan='1' colspan='1'>&amp;apos;</td>
  185.      * </tr>
  186.      * </table>
  187.      * <p><code>AttrEscapes:</code>
  188.      * The following characters need to be escaped:</p>
  189.      * <table border='1'>
  190.      * <tr>
  191.      * <td>character</td>
  192.      * <td>should be escaped and written as</td>
  193.      * </tr>
  194.      * <tr>
  195.      * <td valign='top' rowspan='1' colspan='1'>&amp;</td>
  196.      * <td valign='top' rowspan='1' colspan='1'>&amp;amp;</td>
  197.      * </tr>
  198.      * <tr>
  199.      * <td valign='top' rowspan='1' colspan='1'>&gt;</td>
  200.      * <td valign='top' rowspan='1' colspan='1'>&amp;gt;</td>
  201.      * </tr>
  202.      * <tr>
  203.      * <td valign='top' rowspan='1' colspan='1'>&quot;</td>
  204.      * <td valign='top' rowspan='1' colspan='1'>&amp;quot;</td>
  205.      * </tr>
  206.      * </table>
  207.      * <p><code>CharEscapes:</code>
  208.      * The following characters need to be escaped:</p>
  209.      * <table border='1'>
  210.      * <tr>
  211.      * <td>character</td>
  212.      * <td>should be escaped and written as</td>
  213.      * </tr>
  214.      * <tr>
  215.      * <td valign='top' rowspan='1' colspan='1'>&amp;</td>
  216.      * <td valign='top' rowspan='1' colspan='1'>&amp;amp;</td>
  217.      * </tr>
  218.      * <tr>
  219.      * <td valign='top' rowspan='1' colspan='1'>&gt;</td>
  220.      * <td valign='top' rowspan='1' colspan='1'>&amp;gt;</td>
  221.      * </tr>
  222.      * </table>
  223.      * <p><code>EscapeFlags_Count:</code>
  224.      * Special value, do not use directly.</p>
  225.      * <p><code>DefaultEscape:</code>
  226.      * Special value, do not use directly.</p>
  227.      *
  228.      */
  229.     enum EscapeFlags
  230.     {
  231.         NoEscapes
  232.         , StdEscapes
  233.         , AttrEscapes
  234.         , CharEscapes
  235.         // Special values, don't use directly
  236.         , EscapeFlags_Count
  237.         , DefaultEscape     = 999
  238.     };
  239.     /**
  240.      * UnRepFlags
  241.      *
  242.      * The unrepresentable flags that indicate how to react when a
  243.      * character cannot be represented in the target encoding.
  244.      *
  245.      * <p><code>UnRep_Fail:</code>
  246.      * Fail the operation.</p>
  247.      * <p><code>UnRep_CharRef:</code>
  248.      * Display the unrepresented character as reference.</p>
  249.      * <p><code>UnRep_CharRef:</code>
  250.      * Replace the unrepresented character with the replacement character.</p>
  251.      * <p><code>DefaultUnRep:</code>
  252.      * Special value, do not use directly.</p>
  253.      *
  254.      */
  255.     enum UnRepFlags
  256.     {
  257.         UnRep_Fail
  258.         , UnRep_CharRef
  259.         , UnRep_Replace
  260.         , DefaultUnRep      = 999
  261.     };
  262.     //@}
  263.     // -----------------------------------------------------------------------
  264.     //  Constructors and Destructor
  265.     // -----------------------------------------------------------------------
  266.     /** @name Constructor and Destructor */
  267.     //@{
  268.     /**
  269.      * @param outEncoding the encoding for the formatted content
  270.      * @param target      the formatTarget where the formatted content is written to
  271.      * @param escapeFlags the escape style for certain character
  272.      * @param unrepFlags  the reaction to unrepresentable character
  273.      */
  274.     XMLFormatter
  275.     (
  276.         const   XMLCh* const            outEncoding
  277.         , const XMLCh* const            docVersion
  278.         ,       XMLFormatTarget* const  target
  279.         , const EscapeFlags             escapeFlags = NoEscapes
  280.         , const UnRepFlags              unrepFlags = UnRep_Fail
  281.         ,       MemoryManager* const    manager = XMLPlatformUtils::fgMemoryManager
  282.     );
  283.     XMLFormatter
  284.     (
  285.         const   char* const             outEncoding
  286.         , const char* const             docVersion
  287.         ,       XMLFormatTarget* const  target
  288.         , const EscapeFlags             escapeFlags = NoEscapes
  289.         , const UnRepFlags              unrepFlags = UnRep_Fail
  290.         ,       MemoryManager* const    manager = XMLPlatformUtils::fgMemoryManager
  291.     );
  292.     ~XMLFormatter();
  293.     //@}
  294.     // -----------------------------------------------------------------------
  295.     //  Formatting methods
  296.     // -----------------------------------------------------------------------
  297.     /** @name Formatting methods */
  298.     //@{
  299.     /**
  300.      * @param toFormat the string to be formatted
  301.      * @param count    length of the string
  302.      * @param escapeFlags the escape style for formatting toFormat
  303.      * @param unrepFlags the reaction for any unrepresentable character in toFormat
  304.      *
  305.      */
  306.     void formatBuf
  307.     (
  308.         const   XMLCh* const    toFormat
  309.         , const unsigned int    count
  310.         , const EscapeFlags     escapeFlags = DefaultEscape
  311.         , const UnRepFlags      unrepFlags = DefaultUnRep
  312.     );
  313.     /**
  314.      * @see formatBuf
  315.      */
  316.     XMLFormatter& operator<<
  317.     (
  318.         const   XMLCh* const    toFormat
  319.     );
  320.     XMLFormatter& operator<<
  321.     (
  322.         const   XMLCh           toFormat
  323.     );
  324.     void writeBOM(const XMLByte* const toFormat
  325.                 , const unsigned int   count);
  326.     //@}
  327.     // -----------------------------------------------------------------------
  328.     //  Getter methods
  329.     // -----------------------------------------------------------------------
  330.     /** @name Getter methods */
  331.     //@{
  332.     /**
  333.      * @return return the encoding set for the formatted content
  334.      */
  335.     const XMLCh* getEncodingName() const;
  336.     /**
  337.      * @return return the transcoder used internally for transcoding the formatter conent
  338.      */
  339.     inline const XMLTranscoder*   getTranscoder() const;
  340.    //@}
  341.     // -----------------------------------------------------------------------
  342.     //  Setter methods
  343.     // -----------------------------------------------------------------------
  344.     /** @name Setter methods */
  345.     //@{
  346.     /**
  347.      * @param newFlags set the escape style for the follow-on formatted content
  348.      */
  349.     void setEscapeFlags
  350.     (
  351.         const   EscapeFlags     newFlags
  352.     );
  353.     /**
  354.      * @param newFlags set the reaction for unrepresentable character
  355.      */
  356.     void setUnRepFlags
  357.     (
  358.         const   UnRepFlags      newFlags
  359.     );
  360.     /**
  361.      * @param newFlags set the escape style for the follow-on formatted content
  362.      * @see setEscapeFlags
  363.      */
  364.     XMLFormatter& operator<<
  365.     (
  366.         const   EscapeFlags     newFlags
  367.     );
  368.     /**
  369.      * @param newFlags set the reaction for unrepresentable character
  370.      * @see setUnRepFlags
  371.      */
  372.     XMLFormatter& operator<<
  373.     (
  374.         const   UnRepFlags      newFlags
  375.     );
  376.     //@}
  377. private :
  378.     // -----------------------------------------------------------------------
  379.     //  Unimplemented constructors and operators
  380.     // -----------------------------------------------------------------------
  381.     XMLFormatter();
  382.     XMLFormatter(const XMLFormatter&);
  383.     XMLFormatter& operator=(const XMLFormatter&);
  384.     // -----------------------------------------------------------------------
  385.     //  Private class constants
  386.     // -----------------------------------------------------------------------
  387.     enum Constants
  388.     {
  389.         kTmpBufSize     = 16 * 1024
  390.     };
  391.     // -----------------------------------------------------------------------
  392.     //  Private helper methods
  393.     // -----------------------------------------------------------------------
  394.     const XMLByte* getCharRef(unsigned int & count, 
  395.                               XMLByte*      &ref, 
  396.                               const XMLCh *  stdRef);  
  397.  
  398.     const void writeCharRef(const XMLCh &toWrite);
  399.     bool inEscapeList(const XMLFormatter::EscapeFlags escStyle
  400.                     , const XMLCh                     toCheck);
  401.                               
  402.     unsigned int handleUnEscapedChars(const XMLCh *                  srcPtr, 
  403.                                       const unsigned int             count, 
  404.                                       const UnRepFlags               unrepFlags);
  405.     void specialFormat
  406.     (
  407.         const   XMLCh* const    toFormat
  408.         , const unsigned int    count
  409.         , const EscapeFlags     escapeFlags
  410.     );
  411.     // -----------------------------------------------------------------------
  412.     //  Private, non-virtual methods
  413.     //
  414.     //  fEscapeFlags
  415.     //      The escape flags we were told to use in formatting. These are
  416.     //      defaults set in the ctor, which can be overridden on a particular
  417.     //      call.
  418.     //
  419.     //  fOutEncoding
  420.     //      This the name of the output encoding. Saved mainly for meaningful
  421.     //      error messages.
  422.     //
  423.     //  fTarget
  424.     //      This is the target object for the formatting operation.
  425.     //
  426.     //  fUnRepFlags
  427.     //      The unrepresentable flags that indicate how to react when a
  428.     //      character cannot be represented in the target encoding.
  429.     //
  430.     //  fXCoder
  431.     //      This the transcoder that we will use. It is created using the
  432.     //      encoding name we were told to use.
  433.     //
  434.     //  fTmpBuf
  435.     //      An output buffer that we use to transcode chars into before we
  436.     //      send them off to be output.
  437.     //
  438.     //  fAposRef
  439.     //  fAmpRef
  440.     //  fGTRef
  441.     //  fLTRef
  442.     //  fQuoteRef
  443.     //      These are character refs for the standard char refs, in the
  444.     //      output encoding. They are faulted in as required, by transcoding
  445.     //      them from fixed Unicode versions.
  446.     //
  447.     //  fIsXML11
  448.     //      for performance reason, we do not store the actual version string
  449.     //      and do the string comparison again and again.
  450.     //
  451.     // -----------------------------------------------------------------------
  452.     EscapeFlags                 fEscapeFlags;
  453.     XMLCh*                      fOutEncoding;
  454.     XMLFormatTarget*            fTarget;
  455.     UnRepFlags                  fUnRepFlags;
  456.     XMLTranscoder*              fXCoder;
  457.     XMLByte                     fTmpBuf[kTmpBufSize + 4];
  458.     XMLByte*                    fAposRef;
  459.     unsigned int                fAposLen;
  460.     XMLByte*                    fAmpRef;
  461.     unsigned int                fAmpLen;
  462.     XMLByte*                    fGTRef;
  463.     unsigned int                fGTLen;
  464.     XMLByte*                    fLTRef;
  465.     unsigned int                fLTLen;
  466.     XMLByte*                    fQuoteRef;
  467.     unsigned int                fQuoteLen;
  468.     bool                        fIsXML11;
  469.     MemoryManager*              fMemoryManager;
  470. };
  471. class XMLPARSER_EXPORT XMLFormatTarget : public XMemory
  472. {
  473. public:
  474.     // -----------------------------------------------------------------------
  475.     //  Constructors and Destructor
  476.     // -----------------------------------------------------------------------
  477.     virtual ~XMLFormatTarget() {}
  478.     // -----------------------------------------------------------------------
  479.     //  Virtual interface
  480.     // -----------------------------------------------------------------------
  481.     virtual void writeChars
  482.     (
  483.           const XMLByte* const      toWrite
  484.         , const unsigned int        count
  485.         ,       XMLFormatter* const formatter
  486.     ) = 0;
  487.     virtual void flush() {};
  488. protected :
  489.     // -----------------------------------------------------------------------
  490.     //  Hidden constructors and operators
  491.     // -----------------------------------------------------------------------
  492.     XMLFormatTarget() {}
  493.     XMLFormatTarget(const XMLFormatTarget&) {}
  494.     void operator=(const XMLFormatTarget&) {}
  495. };
  496. // ---------------------------------------------------------------------------
  497. //  XMLFormatter: Getter methods
  498. // ---------------------------------------------------------------------------
  499. inline const XMLCh* XMLFormatter::getEncodingName() const
  500. {
  501.     return fOutEncoding;
  502. }
  503. inline const XMLTranscoder* XMLFormatter::getTranscoder() const
  504. {
  505.     return fXCoder;
  506. }
  507. // ---------------------------------------------------------------------------
  508. //  XMLFormatter: Setter methods
  509. // ---------------------------------------------------------------------------
  510. inline void XMLFormatter::setEscapeFlags(const EscapeFlags newFlags)
  511. {
  512.     fEscapeFlags = newFlags;
  513. }
  514. inline void XMLFormatter::setUnRepFlags(const UnRepFlags newFlags)
  515. {
  516.     fUnRepFlags = newFlags;
  517. }
  518. inline XMLFormatter& XMLFormatter::operator<<(const EscapeFlags newFlags)
  519. {
  520.     fEscapeFlags = newFlags;
  521.     return *this;
  522. }
  523. inline XMLFormatter& XMLFormatter::operator<<(const UnRepFlags newFlags)
  524. {
  525.     fUnRepFlags = newFlags;
  526.     return *this;
  527. }
  528. XERCES_CPP_NAMESPACE_END
  529. #endif