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

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2001-2003 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) 2001, 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.  * $Id: RegularExpression.hpp,v 1.10 2003/05/22 02:10:52 knoaman Exp $
  58.  */
  59. #if !defined(REGULAREXPRESSION_HPP)
  60. #define REGULAREXPRESSION_HPP
  61. // ---------------------------------------------------------------------------
  62. //  Includes
  63. // ---------------------------------------------------------------------------
  64. #include <xercesc/util/RefArrayVectorOf.hpp>
  65. #include <xercesc/util/XMLString.hpp>
  66. #include <xercesc/util/Janitor.hpp>
  67. #include <xercesc/util/Mutexes.hpp>
  68. #include <xercesc/util/regx/Op.hpp>
  69. #include <xercesc/util/regx/TokenFactory.hpp>
  70. #include <xercesc/util/regx/BMPattern.hpp>
  71. #include <xercesc/util/regx/ModifierToken.hpp>
  72. #include <xercesc/util/regx/ConditionToken.hpp>
  73. #include <xercesc/util/regx/OpFactory.hpp>
  74. XERCES_CPP_NAMESPACE_BEGIN
  75. // ---------------------------------------------------------------------------
  76. //  Forward Declaration
  77. // ---------------------------------------------------------------------------
  78. class RangeToken;
  79. class Match;
  80. class XMLUTIL_EXPORT RegularExpression : public XMemory
  81. {
  82. public:
  83.     // -----------------------------------------------------------------------
  84.     //  Public Constructors and Destructor
  85.     // -----------------------------------------------------------------------
  86.     RegularExpression
  87.     (
  88.         const char* const pattern
  89.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  90.     );
  91.     RegularExpression
  92.     (
  93.         const char* const pattern
  94.         , const char* const options
  95.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  96.     );
  97.     RegularExpression
  98.     (
  99.         const XMLCh* const pattern
  100.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  101.     );
  102.     RegularExpression
  103.     (
  104.         const XMLCh* const pattern
  105.         , const XMLCh* const options
  106.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  107.     );
  108.     ~RegularExpression();
  109.     // -----------------------------------------------------------------------
  110.     //  Public Constants
  111.     // -----------------------------------------------------------------------
  112.     static const unsigned int   MARK_PARENS;
  113.     static const unsigned int   IGNORE_CASE;
  114.     static const unsigned int   SINGLE_LINE;
  115.     static const unsigned int   MULTIPLE_LINE;
  116.     static const unsigned int   EXTENDED_COMMENT;
  117.     static const unsigned int   USE_UNICODE_CATEGORY;
  118.     static const unsigned int   UNICODE_WORD_BOUNDARY;
  119.     static const unsigned int   PROHIBIT_HEAD_CHARACTER_OPTIMIZATION;
  120.     static const unsigned int   PROHIBIT_FIXED_STRING_OPTIMIZATION;
  121.     static const unsigned int   XMLSCHEMA_MODE;
  122.     static const unsigned int   SPECIAL_COMMA;
  123.     static const unsigned short WT_IGNORE;
  124.     static const unsigned short WT_LETTER;
  125.     static const unsigned short WT_OTHER;
  126.     // -----------------------------------------------------------------------
  127.     //  Public Helper methods
  128.     // -----------------------------------------------------------------------
  129.     static int getOptionValue(const XMLCh ch);
  130.     // -----------------------------------------------------------------------
  131.     //  Matching methods
  132.     // -----------------------------------------------------------------------
  133.     bool matches(const char* const matchString);
  134.     bool matches(const char* const matchString, const int start,
  135.                  const int end);
  136.     bool matches(const char* const matchString, Match* const pMatch);
  137.     bool matches(const char* const matchString, const int start,
  138.                  const int end, Match* const pMatch);
  139.     bool matches(const XMLCh* const matchString);
  140.     bool matches(const XMLCh* const matchString, const int start,
  141.                  const int end);
  142.     bool matches(const XMLCh* const matchString, Match* const pMatch);
  143.     bool matches(const XMLCh* const matchString, const int start,
  144.                  const int end, Match* const pMatch);
  145.     // -----------------------------------------------------------------------
  146.     //  Tokenize methods
  147.     // -----------------------------------------------------------------------
  148.     // Note: The caller owns the string vector that is returned, and is responsible
  149.     //       for deleting it.
  150.     RefArrayVectorOf<XMLCh> *tokenize(const char* const matchString);
  151.     RefArrayVectorOf<XMLCh> *tokenize(const char* const matchString, const int start,
  152.                                       const int end);
  153.     RefArrayVectorOf<XMLCh> *tokenize(const XMLCh* const matchString);
  154.     RefArrayVectorOf<XMLCh> *tokenize(const XMLCh* const matchString,
  155.                                       const int start, const int end);
  156.     // -----------------------------------------------------------------------
  157.     //  Replace methods
  158.     // -----------------------------------------------------------------------
  159.     // Note: The caller owns the XMLCh* that is returned, and is responsible for
  160.     //       deleting it.
  161.     XMLCh *replace(const char* const matchString, const char* const replaceString);
  162.     XMLCh *replace(const char* const matchString, const char* const replaceString,
  163.                    const int start, const int end);
  164.     XMLCh *replace(const XMLCh* const matchString, const XMLCh* const replaceString);
  165.     XMLCh *replace(const XMLCh* const matchString, const XMLCh* const replaceString,
  166.                    const int start, const int end);
  167. private:
  168.     // -----------------------------------------------------------------------
  169.     //  Private data types
  170.     // -----------------------------------------------------------------------
  171.     class XMLUTIL_EXPORT Context : public XMemory
  172.     {
  173.         public :
  174.             Context(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
  175.             ~Context();
  176.             inline const XMLCh* getString() const { return fString; }
  177.             void reset(const XMLCh* const string, const int start,
  178.                        const int limit, const int noClosures);
  179.             bool nextCh(XMLInt32& ch, int& offset, const short direction);
  180.             bool      fInUse;
  181.             bool      fAdoptMatch;
  182.             int       fStart;
  183.             int       fLimit;
  184.             int       fLength;
  185.             int       fSize;
  186.             int*      fOffsets;
  187.             Match*    fMatch;
  188.             XMLCh*    fString;
  189.             MemoryManager* fMemoryManager;
  190.             friend class Janitor<Context>;
  191.     };
  192.     // -----------------------------------------------------------------------
  193.     //  Unimplemented constructors and operators
  194.     // -----------------------------------------------------------------------
  195.     RegularExpression(const RegularExpression&);
  196.     RegularExpression& operator=(const RegularExpression&);
  197.     // -----------------------------------------------------------------------
  198.     //  Cleanup methods
  199.     // -----------------------------------------------------------------------
  200.     void cleanUp();
  201.     // -----------------------------------------------------------------------
  202.     //  Setter methods
  203.     // -----------------------------------------------------------------------
  204.     void setPattern(const XMLCh* const pattern, const XMLCh* const options=0);
  205.     // -----------------------------------------------------------------------
  206.     //  Private Helper methods
  207.     // -----------------------------------------------------------------------
  208.     void prepare();
  209.     int parseOptions(const XMLCh* const options);
  210.     bool isSet(const int options, const int flag);
  211.     unsigned short getWordType(const XMLCh* const target, const int begin,
  212.                                const int end, const int offset);
  213.     unsigned short getCharType(const XMLCh ch);
  214.     unsigned short getPreviousWordType(const XMLCh* const target,
  215.                                        const int start, const int end,
  216.                                        int offset);
  217.     /**
  218.       *    Matching helpers
  219.       */
  220.     int match(Context* const context, const Op* const operations, int offset,
  221.               const short direction);
  222.     bool matchIgnoreCase(const XMLInt32 ch1, const XMLInt32 ch2);
  223.     /**
  224.       *    Helper methods used by match(Context* ...)
  225.       */
  226.     bool matchChar(Context* const context, const XMLInt32 ch, int& offset,
  227.                    const short direction, const bool ignoreCase);
  228.     bool matchDot(Context* const context, int& offset, const short direction);
  229.     bool matchRange(Context* const context, const Op* const op,
  230.                     int& offset, const short direction, const bool ignoreCase);
  231.     bool matchAnchor(Context* const context, const XMLInt32 ch,
  232.                      const int offset);
  233.     bool matchBackReference(Context* const context, const XMLInt32 ch,
  234.                             int& offset, const short direction,
  235.                             const bool ignoreCase);
  236.     bool matchString(Context* const context, const XMLCh* const literal,
  237.                      int& offset, const short direction, const bool ignoreCase);
  238.     int  matchUnion(Context* const context, const Op* const op, int offset,
  239.                     const short direction);
  240.     int matchCapture(Context* const context, const Op* const op, int offset,
  241.                      const short direction);
  242.     bool matchCondition(Context* const context, const Op* const op, int offset,
  243.                         const short direction);
  244.     int matchModifier(Context* const context, const Op* const op, int offset,
  245.                       const short direction);
  246.     /**
  247.      *    Tokenize helper
  248.      *
  249.      *    This overloaded tokenize is for internal use only. It provides a way to
  250.      *    keep track of the sub-expressions in each match of the pattern.
  251.      *
  252.      *    It is called by the other tokenize methods, and by the replace method.
  253.      *    The caller is responsible for the deletion of the returned
  254.      *    RefArrayVectorOf<XMLCh*>
  255.      */
  256.     RefArrayVectorOf<XMLCh> *tokenize(const XMLCh* const matchString,
  257.                                       const int start, const int end,
  258.                                       RefVectorOf<Match> *subEx);
  259.     /**
  260.      *    Replace helpers
  261.      *
  262.      *    Note: the caller owns the XMLCh* that is returned
  263.      */
  264.     const XMLCh *subInExp(const XMLCh* const repString,
  265.                           const XMLCh* const origString,
  266.                           const Match* subEx);
  267.     /**
  268.      *    Converts a token tree into an operation tree
  269.      */
  270.     void compile(const Token* const token);
  271.     Op*  compile(const Token* const token, Op* const next,
  272.                  const bool reverse);
  273.     /**
  274.       *    Helper methods used by compile
  275.       */
  276.     Op* compileSingle(const Token* const token, Op* const next,
  277.                       const unsigned short tokType);
  278.     Op* compileUnion(const Token* const token, Op* const next,
  279.                      const bool reverse);
  280.     Op* compileCondition(const Token* const token, Op* const next,
  281.                          const bool reverse);
  282.     Op* compileParenthesis(const Token* const token, Op* const next,
  283.                            const bool reverse);
  284.     Op* compileLook(const Token* const token, const Op* const next,
  285.                     const bool reverse, const unsigned short tokType);
  286.     Op* compileConcat(const Token* const token, Op* const next,
  287.                       const bool reverse);
  288.     Op* compileClosure(const Token* const token, Op* const next,
  289.                        const bool reverse, const unsigned short tokType);
  290.     // -----------------------------------------------------------------------
  291.     //  Private data members
  292.     // -----------------------------------------------------------------------
  293.     bool               fHasBackReferences;
  294.     bool               fFixedStringOnly;
  295.     int                fNoGroups;
  296.     int                fMinLength;
  297.     int                fNoClosures;
  298.     unsigned int       fOptions;
  299.     Context*           fContext;
  300.     BMPattern*         fBMPattern;
  301.     XMLCh*             fPattern;
  302.     XMLCh*             fFixedString;
  303.     Op*                fOperations;
  304.     Token*             fTokenTree;
  305.     RangeToken*        fFirstChar;
  306.     static RangeToken* fWordRange;
  307.     OpFactory          fOpFactory;
  308.     XMLMutex           fMutex;
  309.     TokenFactory*      fTokenFactory;
  310.     MemoryManager*     fMemoryManager;
  311. };
  312.   // ---------------------------------------------------------------------------
  313.   //  RegularExpression: Cleanup methods
  314.   // ---------------------------------------------------------------------------
  315.   inline void RegularExpression::cleanUp() {
  316.       fMemoryManager->deallocate(fPattern);//delete [] fPattern;
  317.       fMemoryManager->deallocate(fFixedString);//delete [] fFixedString;
  318.       delete fContext;
  319.       delete fBMPattern;
  320.       delete fTokenFactory;
  321.   }
  322.   // ---------------------------------------------------------------------------
  323.   //  RegularExpression: Helper methods
  324.   // ---------------------------------------------------------------------------
  325.   inline bool RegularExpression::isSet(const int options, const int flag) {
  326.       return (options & flag) == flag;
  327.   }
  328.   inline Op* RegularExpression::compileLook(const Token* const token,
  329.                                             const Op* const next,
  330.                                             const bool reverse,
  331.                                             const unsigned short tokType) {
  332.       Op*    ret = 0;
  333.       Op*    result = compile(token->getChild(0), 0, reverse);
  334.       switch(tokType) {
  335.       case Token::T_LOOKAHEAD:
  336.           ret = fOpFactory.createLookOp(Op::O_LOOKAHEAD, next, result);
  337.           break;
  338.       case Token::T_NEGATIVELOOKAHEAD:
  339.           ret = fOpFactory.createLookOp(Op::O_NEGATIVELOOKAHEAD, next, result);
  340.           break;
  341.       case Token::T_LOOKBEHIND:
  342.           ret = fOpFactory.createLookOp(Op::O_LOOKBEHIND, next, result);
  343.           break;
  344.       case Token::T_NEGATIVELOOKBEHIND:
  345.           ret = fOpFactory.createLookOp(Op::O_NEGATIVELOOKBEHIND, next, result);
  346.           break;
  347.       case Token::T_INDEPENDENT:
  348.           ret = fOpFactory.createIndependentOp(next, result);
  349.           break;
  350.       case Token::T_MODIFIERGROUP:
  351.           ret = fOpFactory.createModifierOp(next, result,
  352.                                      ((ModifierToken *) token)->getOptions(),
  353.                                      ((ModifierToken *) token)->getOptionsMask());
  354.           break;
  355.       }
  356.       return ret;
  357.   }
  358.   inline Op* RegularExpression::compileSingle(const Token* const token,
  359.                                               Op* const next,
  360.                                               const unsigned short tokType) {
  361.       Op* ret = 0;
  362.       switch (tokType) {
  363.       case Token::T_DOT:
  364.           ret = fOpFactory.createDotOp();
  365.           break;
  366.       case Token::T_CHAR:
  367.           ret = fOpFactory.createCharOp(token->getChar());
  368.           break;
  369.       case Token::T_ANCHOR:
  370.           ret = fOpFactory.createAnchorOp(token->getChar());
  371.           break;
  372.       case Token::T_RANGE:
  373.       case Token::T_NRANGE:
  374.           ret = fOpFactory.createRangeOp(token);
  375.           break;
  376.       case Token::T_EMPTY:
  377.           ret = next;
  378.           break;
  379.       case Token::T_STRING:
  380.           ret = fOpFactory.createStringOp(token->getString());
  381.           break;
  382.       case Token::T_BACKREFERENCE:
  383.           ret = fOpFactory.createBackReferenceOp(token->getReferenceNo());
  384.           break;
  385.       }
  386.       if (tokType != Token::T_EMPTY)
  387.           ret->setNextOp(next);
  388.       return ret;
  389.   }
  390.   inline Op* RegularExpression::compileUnion(const Token* const token,
  391.                                              Op* const next,
  392.                                              const bool reverse) {
  393.       int tokSize = token->size();
  394.       UnionOp* uniOp = fOpFactory.createUnionOp(tokSize);
  395.       for (int i=0; i<tokSize; i++) {
  396.           uniOp->addElement(compile(token->getChild(i), next, reverse));
  397.       }
  398.       return uniOp;
  399.   }
  400.   inline Op* RegularExpression::compileCondition(const Token* const token,
  401.                                                  Op* const next,
  402.                                                  const bool reverse) {
  403.       Token* condTok = ((ConditionToken*) token)->getConditionToken();
  404.       Token* yesTok  = token->getChild(0);
  405.       Token* noTok   = token->getChild(1);
  406.       int    refNo   = token->getReferenceNo();
  407.       Op*    condOp  = (condTok == 0) ? 0 : compile(condTok, 0, reverse);
  408.       Op*    yesOp   = compile(yesTok, next, reverse);
  409.       Op*    noOp    = (noTok == 0) ? 0 : compile(noTok, next, reverse);
  410.       return fOpFactory.createConditionOp(next, refNo, condOp, yesOp, noOp);
  411.   }
  412.   inline Op* RegularExpression::compileParenthesis(const Token* const token,
  413.                                                    Op* const next,
  414.                                                    const bool reverse) {
  415.       if (token->getNoParen() == 0)
  416.           return compile(token->getChild(0), next, reverse);
  417.       Op* captureOp    = 0;
  418.       if (reverse) {
  419.           captureOp = fOpFactory.createCaptureOp(token->getNoParen(), next);
  420.           captureOp = compile(token->getChild(0), captureOp, reverse);
  421.           return fOpFactory.createCaptureOp(-token->getNoParen(), captureOp);
  422.       }
  423.       captureOp = fOpFactory.createCaptureOp(-token->getNoParen(), next);
  424.       captureOp = compile(token->getChild(0), captureOp, reverse);
  425.       return fOpFactory.createCaptureOp(token->getNoParen(), captureOp);
  426.   }
  427.   inline Op* RegularExpression::compileConcat(const Token* const token,
  428.                                               Op*  const next,
  429.                                               const bool reverse) {
  430.       Op* ret = next;
  431.       int tokSize = token->size();
  432.       if (!reverse) {
  433.           for (int i= tokSize - 1; i>=0; i--) {
  434.               ret = compile(token->getChild(i), ret, false);
  435.           }
  436.       }
  437.       else {
  438.           for (int i= 0; i< tokSize; i++) {
  439.               ret = compile(token->getChild(i), ret, true);
  440.           }
  441.       }
  442.       return ret;
  443.   }
  444.   inline Op* RegularExpression::compileClosure(const Token* const token,
  445.                                                Op* const next,
  446.                                                const bool reverse,
  447.                                                const unsigned short tokType) {
  448.       Op*    ret      = 0;
  449.       Token* childTok = token->getChild(0);
  450.       int    min      = token->getMin();
  451.       int    max      = token->getMax();
  452.       if (min >= 0 && min == max) {
  453.           ret = next;
  454.           for (int i=0; i< min; i++) {
  455.               ret = compile(childTok, ret, reverse);
  456.           }
  457.           return ret;
  458.       }
  459.       if (min > 0 && max > 0)
  460.           max -= min;
  461.       if (max > 0) {
  462.           ret = next;
  463.           for (int i=0; i<max; i++) {
  464.               ChildOp* childOp = fOpFactory.createQuestionOp(
  465.                   tokType == Token::T_NONGREEDYCLOSURE);
  466.               childOp->setNextOp(next);
  467.               childOp->setChild(compile(childTok, ret, reverse));
  468.               ret = childOp;
  469.           }
  470.       }
  471.       else {
  472.           ChildOp* childOp = 0;
  473.           if (tokType == Token::T_NONGREEDYCLOSURE) {
  474.               childOp = fOpFactory.createNonGreedyClosureOp();
  475.           }
  476.           else {
  477.               if (childTok->getMinLength() == 0)
  478.                   childOp = fOpFactory.createClosureOp(fNoClosures++);
  479.               else
  480.                   childOp = fOpFactory.createClosureOp(-1);
  481.           }
  482.           childOp->setNextOp(next);
  483.           childOp->setChild(compile(childTok, childOp, reverse));
  484.           ret = childOp;
  485.       }
  486.       if (min > 0) {
  487.           for (int i=0; i< min; i++) {
  488.               ret = compile(childTok, ret, reverse);
  489.           }
  490.       }
  491.       return ret;
  492.   }
  493.   inline int RegularExpression::matchUnion(Context* const context,
  494.                                            const Op* const op, int offset,
  495.                                            const short direction)
  496.   {
  497.       unsigned int opSize = op->getSize();
  498.       int ret = -1;
  499.       for (unsigned int i=0; i < opSize; i++) {
  500.           ret = match(context, op->elementAt(i), offset, direction);
  501.           if (ret == context->fLimit)
  502.               return ret;
  503.       }
  504.       return -1;
  505.   }
  506.   inline int RegularExpression::matchModifier(Context* const context,
  507.                                               const Op* const op, int offset,
  508.                                               const short direction)
  509.   {
  510.       int saveOptions = fOptions;
  511.       fOptions |= (int) op->getData();
  512.       fOptions &= (int) ~op->getData2();
  513.       int ret = match(context, op->getChild(), offset, direction);
  514.       fOptions = saveOptions;
  515.       return ret;
  516.   }
  517.   inline unsigned short RegularExpression::getWordType(const XMLCh* const target
  518.                                                        , const int begin
  519.                                                        , const int end
  520.                                                        , const int offset)
  521.   {
  522.       if (offset < begin || offset >= end)
  523.           return WT_OTHER;
  524.       return getCharType(target[offset]);
  525.   }
  526.   inline
  527.   unsigned short RegularExpression::getPreviousWordType(const XMLCh* const target
  528.                                                         , const int start
  529.                                                         , const int end
  530.                                                         , int offset)
  531.   {
  532.       unsigned short ret = getWordType(target, start, end, --offset);
  533.       while (ret == WT_IGNORE) {
  534.           ret = getWordType(target, start, end, --offset);
  535.       }
  536.       return ret;
  537.   }
  538.   inline bool RegularExpression::matchIgnoreCase(const XMLInt32 ch1,
  539.                                                const XMLInt32 ch2)
  540. {
  541.     return (0==XMLString::compareNIString((XMLCh*)&ch1,(XMLCh*)&ch2, 1));
  542. }
  543. XERCES_CPP_NAMESPACE_END
  544. #endif
  545. /**
  546.   * End of file RegularExpression.hpp
  547.   */