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

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 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) 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.  * $Log: BMPattern.cpp,v $
  58.  * Revision 1.3  2003/05/15 18:42:54  knoaman
  59.  * Partial implementation of the configurable memory manager.
  60.  *
  61.  * Revision 1.2  2002/11/04 15:17:00  tng
  62.  * C++ Namespace Support.
  63.  *
  64.  * Revision 1.1.1.1  2002/02/01 22:22:28  peiyongz
  65.  * sane_include
  66.  *
  67.  * Revision 1.2  2001/05/11 13:26:40  tng
  68.  * Copyright update.
  69.  *
  70.  * Revision 1.1  2001/03/02 19:22:31  knoaman
  71.  * Schema: Regular expression handling part I
  72.  *
  73.  */
  74. // ---------------------------------------------------------------------------
  75. //  Includes
  76. // ---------------------------------------------------------------------------
  77. #include <xercesc/util/regx/BMPattern.hpp>
  78. #include <xercesc/util/XMLString.hpp>
  79. #include <xercesc/util/Janitor.hpp>
  80. #include <xercesc/framework/MemoryManager.hpp>
  81. XERCES_CPP_NAMESPACE_BEGIN
  82. // ---------------------------------------------------------------------------
  83. //  BMPattern: Constructors
  84. // ---------------------------------------------------------------------------
  85. BMPattern::BMPattern( const XMLCh*         const pattern
  86.                     ,       bool                 ignoreCase
  87.                     ,       MemoryManager* const manager) :
  88.     fIgnoreCase(ignoreCase)
  89.     , fShiftTableLen(256)
  90.     , fShiftTable(0)
  91.     , fPattern(0)
  92.     , fUppercasePattern(0)
  93.     , fMemoryManager(manager)
  94. {
  95. try {
  96.         fPattern = XMLString::replicate(pattern, fMemoryManager);
  97. initialize();
  98. }
  99. catch(...) {
  100. cleanUp();
  101. throw;
  102. }
  103. }
  104. BMPattern::BMPattern( const XMLCh*         const pattern
  105.                     ,       int                  tableSize
  106.                     ,       bool                 ignoreCase
  107.                     ,       MemoryManager* const manager) :
  108.     fIgnoreCase(ignoreCase)
  109.     , fShiftTableLen(tableSize)
  110.     , fShiftTable(0)
  111.     , fPattern(0)
  112.     , fUppercasePattern(0)
  113.     , fMemoryManager(manager)
  114. {
  115. try {
  116.         fPattern = XMLString::replicate(pattern, fMemoryManager);
  117. initialize();
  118. }
  119. catch(...) {
  120. cleanUp();
  121. throw;
  122. }
  123. }
  124. BMPattern::~BMPattern() {
  125. cleanUp();
  126. }
  127. // ---------------------------------------------------------------------------
  128. //  BMPattern: matches methods
  129. // ---------------------------------------------------------------------------
  130. int BMPattern::matches(const XMLCh* const content, int start, int limit) {
  131. const unsigned int patternLen = XMLString::stringLen(fPattern);
  132. // Uppercase Content
  133. XMLCh* ucContent = 0;
  134. if (patternLen == 0)
  135. return start;
  136. if (fIgnoreCase) {
  137. ucContent = XMLString::replicate(content, fMemoryManager);
  138. XMLString::upperCase(ucContent);
  139. }
  140. ArrayJanitor<XMLCh> janUCContent(ucContent, fMemoryManager);
  141. int index = start + patternLen;
  142. while (index <= limit) {
  143. int patternIndex = patternLen;
  144. int nIndex = index + 1;
  145. XMLCh ch;
  146. while (patternIndex > 0) {
  147. ch = content[--index];
  148. if (ch != fPattern[--patternIndex]) {
  149. // No match, so we will break. But first we have
  150. // to check the ignore case flag. If it is set, then
  151. // we try to match with the case ignored
  152. if (!fIgnoreCase ||
  153. (fUppercasePattern[patternIndex] != ucContent[index]))
  154. break;
  155. }
  156. if (patternIndex == 0)
  157. return index;
  158. }
  159. index += fShiftTable[ch % fShiftTableLen] + 1;
  160. if (index < nIndex)
  161. index = nIndex;
  162. }
  163. return -1;
  164. }
  165. // ---------------------------------------------------------------------------
  166. //  BMPattern: private helpers methods
  167. // ---------------------------------------------------------------------------
  168. void BMPattern::initialize() {
  169. const unsigned int patternLen = XMLString::stringLen(fPattern);
  170. XMLCh* lowercasePattern = 0;
  171. fShiftTable = (int*) fMemoryManager->allocate(fShiftTableLen*sizeof(int)); //new int[fShiftTableLen];
  172. if (fIgnoreCase) {
  173. fUppercasePattern = XMLString::replicate(fPattern, fMemoryManager);
  174. lowercasePattern = XMLString::replicate(fPattern, fMemoryManager);
  175. XMLString::upperCase(fUppercasePattern);
  176. XMLString::lowerCase(lowercasePattern);
  177. }
  178. ArrayJanitor<XMLCh> janLowercase(lowercasePattern, fMemoryManager);
  179. for (unsigned int i=0; i< fShiftTableLen; i++)
  180. fShiftTable[i] = patternLen;
  181. for (unsigned int k=0; k< patternLen; k++) {
  182. XMLCh ch = fPattern[k];
  183. int diff = patternLen - k - 1;
  184. int index = ch % fShiftTableLen;
  185. if (diff < fShiftTable[index])
  186. fShiftTable[index] = diff;
  187. if (fIgnoreCase) {
  188. for (int j=0; j< 2; j++) {
  189. ch = (j == 0) ? fUppercasePattern[k] : lowercasePattern[k];
  190. index = ch % fShiftTableLen;
  191. if (diff < fShiftTable[index])
  192. fShiftTable[index] = diff;
  193. }
  194. }
  195. }
  196. }
  197. // ---------------------------------------------------------------------------
  198. //  BMPattern: Cleanup
  199. // ---------------------------------------------------------------------------
  200. void BMPattern::cleanUp() {
  201.     fMemoryManager->deallocate(fPattern);//delete [] fPattern;
  202.     fMemoryManager->deallocate(fUppercasePattern);//delete [] fUppercasePattern;
  203.     fMemoryManager->deallocate(fShiftTable);
  204. }
  205. XERCES_CPP_NAMESPACE_END
  206. /**
  207.   * End of file BMPattern.cpp
  208.   */