xmlrangefactory.cpp
来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 257 行
CPP
257 行
/* * Copyright 2001-2002,2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* * $Log: XMLRangeFactory.cpp,v $ * Revision 1.6 2004/09/08 13:56:47 peiyongz * Apache License Version 2.0 * * Revision 1.5 2003/05/18 14:02:06 knoaman * Memory manager implementation: pass per instance manager. * * Revision 1.4 2002/11/04 15:17:01 tng * C++ Namespace Support. * * Revision 1.3 2002/05/24 16:42:20 knoaman * Performance fixes: eliminate mulitple calls to addRange and sort. * * Revision 1.2 2002/02/05 13:20:06 tng * [Bug 5716] Can't parse with Validation more than one file. * * Revision 1.1.1.1 2002/02/01 22:22:34 peiyongz * sane_include * * Revision 1.4 2001/10/15 20:18:32 knoaman * Fix for bug 4177. * * Revision 1.3 2001/05/11 13:26:52 tng * Copyright update. * * Revision 1.2 2001/05/03 18:18:02 knoaman * Some design changes: * o Changed the TokenFactory from a single static instance, to a * normal class. Each RegularExpression object will have its own * instance of TokenFactory, and that instance will be passed to * other classes that need to use a TokenFactory to create Token * objects (with the exception of RangeTokenMap). * o Added a new class RangeTokenMap to map a the different ranges * in a given category to a specific RangeFactory object. In the old * design RangeFactory had dual functionality (act as a Map, and as * a factory for creating RangeToken(s)). The RangeTokenMap will * have its own copy of the TokenFactory. There will be only one * instance of the RangeTokenMap class, and that instance will be * lazily deleted when XPlatformUtils::Terminate is called. * * Revision 1.1 2001/03/02 19:26:50 knoaman * Schema: Regular expression handling part II * */// ---------------------------------------------------------------------------// Includes// ---------------------------------------------------------------------------#include <xercesc/util/regx/XMLRangeFactory.hpp>#include <xercesc/internal/CharTypeTables.hpp>#include <xercesc/util/regx/RegxDefs.hpp>#include <xercesc/util/regx/TokenFactory.hpp>#include <xercesc/util/regx/RangeToken.hpp>#include <xercesc/util/regx/RangeTokenMap.hpp>#include <xercesc/util/Janitor.hpp>#include <string.h>XERCES_CPP_NAMESPACE_BEGIN// ---------------------------------------------------------------------------// Local static functions// ---------------------------------------------------------------------------static void setupRange(XMLInt32* const rangeMap, const XMLCh* const theTable, unsigned int startingIndex) { const XMLCh* pchCur = theTable; // Do the ranges first while (*pchCur) { rangeMap[startingIndex++] = *pchCur++; } // Skip the range terminator pchCur++; // And then the singles until we hit its terminator while (*pchCur) { const XMLCh chSingle = *pchCur++; rangeMap[startingIndex++] = chSingle; rangeMap[startingIndex++] = chSingle; }}static unsigned int getTableLen(const XMLCh* const theTable) { unsigned int rangeLen = XMLString::stringLen(theTable); return rangeLen + 2*XMLString::stringLen(theTable + rangeLen + 1);}// ---------------------------------------------------------------------------// XMLRangeFactory: Constructors and Destructor// ---------------------------------------------------------------------------XMLRangeFactory::XMLRangeFactory() : fRangesCreated(false) , fKeywordsInitialized(false){}XMLRangeFactory::~XMLRangeFactory() {}// ---------------------------------------------------------------------------// XMLRangeFactory: Range creation methods// ---------------------------------------------------------------------------void XMLRangeFactory::buildRanges() { if (fRangesCreated) return; if (!fKeywordsInitialized) { initializeKeywordMap(); } RangeTokenMap* rangeTokMap = RangeTokenMap::instance(); TokenFactory* tokFactory = rangeTokMap->getTokenFactory(); // Create space ranges unsigned int wsTblLen = getTableLen(gWhitespaceChars); RangeToken* tok = tokFactory->createRange(); XMLInt32* wsRange = (XMLInt32*) XMLPlatformUtils::fgMemoryManager->allocate ( wsTblLen * sizeof(XMLInt32) );//new XMLInt32[wsTblLen]; tok->setRangeValues(wsRange, wsTblLen); setupRange(wsRange, gWhitespaceChars, 0); rangeTokMap->setRangeToken(fgXMLSpace, tok); // Create digits ranges tok = tokFactory->createRange(); unsigned int digitTblLen = getTableLen(gDigitChars); XMLInt32* digitRange = (XMLInt32*) XMLPlatformUtils::fgMemoryManager->allocate ( digitTblLen * sizeof(XMLInt32) );//new XMLInt32[digitTblLen]; tok->setRangeValues(digitRange, digitTblLen); setupRange(digitRange, gDigitChars, 0); rangeTokMap->setRangeToken(fgXMLDigit, tok); // Build word ranges unsigned int baseTblLen = getTableLen(gBaseChars); unsigned int ideoTblLen = getTableLen(gIdeographicChars); unsigned int wordRangeLen = baseTblLen + ideoTblLen + digitTblLen; XMLInt32* wordRange = (XMLInt32*) XMLPlatformUtils::fgMemoryManager->allocate ( wordRangeLen * sizeof(XMLInt32) );//new XMLInt32[wordRangeLen]; ArrayJanitor<XMLInt32> janWordRange(wordRange, XMLPlatformUtils::fgMemoryManager); setupRange(wordRange, gBaseChars, 0); setupRange(wordRange, gIdeographicChars, baseTblLen); memcpy(wordRange + baseTblLen + ideoTblLen, digitRange, digitTblLen * sizeof(XMLInt32)); // Create NameChar ranges tok = tokFactory->createRange(); unsigned int combTblLen = getTableLen(gCombiningChars); unsigned int extTblLen = getTableLen(gExtenderChars); unsigned int nameTblLen = wordRangeLen + combTblLen + extTblLen; XMLInt32* nameRange = (XMLInt32*) XMLPlatformUtils::fgMemoryManager->allocate ( (nameTblLen + 8) * sizeof(XMLInt32) );//new XMLInt32[nameTblLen + 8]; tok->setRangeValues(nameRange, nameTblLen + 8); memcpy(nameRange, wordRange, wordRangeLen * sizeof(XMLInt32)); setupRange(nameRange, gCombiningChars, wordRangeLen); setupRange(nameRange, gExtenderChars, wordRangeLen + combTblLen); nameRange[nameTblLen++] = chDash; nameRange[nameTblLen++] = chDash; nameRange[nameTblLen++] = chColon; nameRange[nameTblLen++] = chColon; nameRange[nameTblLen++] = chPeriod; nameRange[nameTblLen++] = chPeriod; nameRange[nameTblLen++] = chUnderscore; nameRange[nameTblLen++] = chUnderscore; tok->sortRanges(); tok->compactRanges(); rangeTokMap->setRangeToken(fgXMLNameChar, tok); // Create initialNameChar ranges tok = tokFactory->createRange(); unsigned int initialNameTblLen = baseTblLen + ideoTblLen; XMLInt32* initialNameRange = (XMLInt32*) XMLPlatformUtils::fgMemoryManager->allocate ( (initialNameTblLen + 4) * sizeof(XMLInt32) );//new XMLInt32[initialNameTblLen + 4]; tok->setRangeValues(initialNameRange, initialNameTblLen + 4); memcpy(initialNameRange, wordRange, initialNameTblLen * sizeof(XMLInt32)); initialNameRange[initialNameTblLen++] = chColon; initialNameRange[initialNameTblLen++] = chColon; initialNameRange[initialNameTblLen++] = chUnderscore; initialNameRange[initialNameTblLen++] = chUnderscore; tok->sortRanges(); tok->compactRanges(); rangeTokMap->setRangeToken(fgXMLInitialNameChar, tok); // Create word range tok = tokFactory->createRange(); tok->setRangeValues(wordRange, wordRangeLen); janWordRange.orphan(); tok->sortRanges(); tok->compactRanges(); rangeTokMap->setRangeToken(fgXMLWord, tok); fRangesCreated = true;}// ---------------------------------------------------------------------------// XMLRangeFactory: Range creation methods// ---------------------------------------------------------------------------void XMLRangeFactory::initializeKeywordMap() { if (fKeywordsInitialized) return; RangeTokenMap* rangeTokMap = RangeTokenMap::instance(); rangeTokMap->addKeywordMap(fgXMLSpace, fgXMLCategory); rangeTokMap->addKeywordMap(fgXMLDigit, fgXMLCategory); rangeTokMap->addKeywordMap(fgXMLWord, fgXMLCategory); rangeTokMap->addKeywordMap(fgXMLNameChar, fgXMLCategory); rangeTokMap->addKeywordMap(fgXMLInitialNameChar, fgXMLCategory); fKeywordsInitialized = true;}XERCES_CPP_NAMESPACE_END/** * End of file XMLRangeFactory.cpp */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?