PageRenderTime 35ms CodeModel.GetById 30ms RepoModel.GetById 1ms app.codeStats 0ms

/ATF2/control-software/epics-3.14.8/extensions/src/ChannelArchiver/ThirdParty/xerces-c-src2_4_0/src/xercesc/util/regx/RangeToken.cpp

http://atf2flightsim.googlecode.com/
C++ | 709 lines | 416 code | 146 blank | 147 comment | 139 complexity | a00be5f5b995386687cb616aa147e3fc MD5 | raw file
Possible License(s): BSD-2-Clause, LGPL-2.0, IPL-1.0, BSD-3-Clause
  1. /*
  2. * The Apache Software License, Version 1.1
  3. *
  4. * Copyright (c) 2001-2002 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: RangeToken.cpp,v $
  58. * Revision 1.1.1.1 2009/03/14 06:42:33 whitegr
  59. * epics channel archiver
  60. *
  61. * Revision 1.8 2003/05/16 21:37:00 knoaman
  62. * Memory manager implementation: Modify constructors to pass in the memory manager.
  63. *
  64. * Revision 1.7 2003/05/15 21:46:47 knoaman
  65. * Add missing include.
  66. *
  67. * Revision 1.6 2002/11/04 15:17:00 tng
  68. * C++ Namespace Support.
  69. *
  70. * Revision 1.5 2002/10/15 18:15:02 knoaman
  71. * [Bug 13490]: - new[]/delete mismatch in RangeToken.cpp
  72. *
  73. * Revision 1.4 2002/05/27 11:46:53 tng
  74. * Fix compilation error. The definition should match declaration.
  75. *
  76. * Revision 1.3 2002/05/24 16:42:20 knoaman
  77. * Performance fixes: eliminate mulitple calls to addRange and sort.
  78. *
  79. * Revision 1.2 2002/03/18 19:29:53 knoaman
  80. * Change constant names to eliminate possible conflict with user defined ones.
  81. *
  82. * Revision 1.1.1.1 2002/02/01 22:22:30 peiyongz
  83. * sane_include
  84. *
  85. * Revision 1.4 2001/05/29 19:39:33 knoaman
  86. * Typo fix
  87. *
  88. * Revision 1.3 2001/05/11 13:26:45 tng
  89. * Copyright update.
  90. *
  91. * Revision 1.2 2001/05/03 18:17:37 knoaman
  92. * Some design changes:
  93. * o Changed the TokenFactory from a single static instance, to a
  94. * normal class. Each RegularExpression object will have its own
  95. * instance of TokenFactory, and that instance will be passed to
  96. * other classes that need to use a TokenFactory to create Token
  97. * objects (with the exception of RangeTokenMap).
  98. * o Added a new class RangeTokenMap to map a the different ranges
  99. * in a given category to a specific RangeFactory object. In the old
  100. * design RangeFactory had dual functionality (act as a Map, and as
  101. * a factory for creating RangeToken(s)). The RangeTokenMap will
  102. * have its own copy of the TokenFactory. There will be only one
  103. * instance of the RangeTokenMap class, and that instance will be
  104. * lazily deleted when XPlatformUtils::Terminate is called.
  105. *
  106. * Revision 1.1 2001/03/02 19:26:46 knoaman
  107. * Schema: Regular expression handling part II
  108. *
  109. */
  110. // ---------------------------------------------------------------------------
  111. // Includes
  112. // ---------------------------------------------------------------------------
  113. #include <xercesc/util/regx/RangeToken.hpp>
  114. #include <xercesc/util/regx/TokenFactory.hpp>
  115. #include <xercesc/util/IllegalArgumentException.hpp>
  116. XERCES_CPP_NAMESPACE_BEGIN
  117. // ---------------------------------------------------------------------------
  118. // Static member data initialization
  119. // ---------------------------------------------------------------------------
  120. const int RangeToken::MAPSIZE = 256;
  121. const unsigned int RangeToken::INITIALSIZE = 16;
  122. // ---------------------------------------------------------------------------
  123. // RangeToken: Constructors and Destructors
  124. // ---------------------------------------------------------------------------
  125. RangeToken::RangeToken(const unsigned short tokType,
  126. MemoryManager* const manager)
  127. : Token(tokType)
  128. , fSorted(false)
  129. , fCompacted(false)
  130. , fNonMapIndex(0)
  131. , fElemCount(0)
  132. , fMaxCount(INITIALSIZE)
  133. , fMap(0)
  134. , fRanges(0)
  135. , fCaseIToken(0)
  136. , fMemoryManager(manager)
  137. {
  138. }
  139. RangeToken::~RangeToken() {
  140. fMemoryManager->deallocate(fMap);//delete [] fMap;
  141. fMemoryManager->deallocate(fRanges);//delete[] fRanges;
  142. }
  143. // ---------------------------------------------------------------------------
  144. // RangeToken: Getter methods
  145. // ---------------------------------------------------------------------------
  146. RangeToken* RangeToken::getCaseInsensitiveToken(TokenFactory* const tokFactory) {
  147. // REVIST
  148. // We will not build a token with case insenstive ranges
  149. // For now we will return a copy of ourselves.
  150. if (fCaseIToken == 0 && tokFactory) {
  151. bool isNRange = (getTokenType() == T_NRANGE) ? true : false;
  152. RangeToken* lwrToken = tokFactory->createRange(isNRange);
  153. lwrToken->mergeRanges(this);
  154. fCaseIToken = lwrToken;
  155. }
  156. return fCaseIToken;
  157. }
  158. // ---------------------------------------------------------------------------
  159. // RangeToken: Setter methods
  160. // ---------------------------------------------------------------------------
  161. void RangeToken::setRangeValues(XMLInt32* const rangeValues, const unsigned int count)
  162. {
  163. if (fRanges) {
  164. if (fMap) {
  165. fMemoryManager->deallocate(fMap);//delete [] fMap;
  166. fMap = 0;
  167. }
  168. fElemCount = 0;
  169. fMemoryManager->deallocate(fRanges);//delete [] fRanges;
  170. fRanges = 0;
  171. }
  172. fElemCount = fMaxCount = count;
  173. fRanges = rangeValues;
  174. }
  175. // ---------------------------------------------------------------------------
  176. // RangeToken: Range manipulation methods
  177. // ---------------------------------------------------------------------------
  178. void RangeToken::addRange(const XMLInt32 start, const XMLInt32 end) {
  179. XMLInt32 val1, val2;
  180. fCaseIToken = 0;
  181. if (start <= end) {
  182. val1 = start;
  183. val2 = end;
  184. }
  185. else {
  186. val1 = end;
  187. val2 = start;
  188. }
  189. if (fRanges == 0) {
  190. fRanges = (XMLInt32*) fMemoryManager->allocate
  191. (
  192. fMaxCount * sizeof(XMLInt32)
  193. );//new XMLInt32[fMaxCount];
  194. fRanges[0] = val1;
  195. fRanges[1] = val2;
  196. fElemCount = 2;
  197. fSorted = true;
  198. }
  199. else {
  200. if (fRanges[fElemCount-1] + 1 == val1) {
  201. fRanges[fElemCount-1] = val2;
  202. return;
  203. }
  204. if (fElemCount + 2 >= fMaxCount) {
  205. expand(2);
  206. }
  207. if (fRanges[fElemCount-1] >= val1)
  208. fSorted = false;
  209. fRanges[fElemCount++] = val1;
  210. fRanges[fElemCount++] = val2;
  211. if (!fSorted) {
  212. sortRanges();
  213. }
  214. }
  215. }
  216. void RangeToken::sortRanges() {
  217. if (fSorted || fRanges == 0)
  218. return;
  219. for (int i = fElemCount - 4; i >= 0; i -= 2) {
  220. for (int j = 0; j <= i; j +=2) {
  221. if (fRanges[j] > fRanges[j + 2]
  222. || (fRanges[j]==fRanges[j+2] && fRanges[j+1] > fRanges[j+3])) {
  223. XMLInt32 tmpVal = fRanges[j+2];
  224. fRanges[j+2] = fRanges[j];
  225. fRanges[j] = tmpVal;
  226. tmpVal = fRanges[j+3];
  227. fRanges[j+3] = fRanges[j+1];
  228. fRanges[j+1] = tmpVal;
  229. }
  230. }
  231. }
  232. fSorted = true;
  233. }
  234. void RangeToken::compactRanges() {
  235. if (fCompacted || fRanges == 0 || fElemCount <= 2)
  236. return;
  237. unsigned int base = 0;
  238. unsigned int target = 0;
  239. while (target < fElemCount) {
  240. if (base != target) {
  241. fRanges[base] = fRanges[target++];
  242. fRanges[base+1] = fRanges[target++];
  243. }
  244. else
  245. target += 2;
  246. XMLInt32 baseEnd = fRanges[base + 1];
  247. while (target < fElemCount) {
  248. XMLInt32 startRange = fRanges[target];
  249. if (baseEnd + 1 < startRange)
  250. break;
  251. XMLInt32 endRange = fRanges[target + 1];
  252. if (baseEnd + 1 == startRange || baseEnd < endRange) {
  253. baseEnd = endRange;
  254. fRanges[base+1] = baseEnd;
  255. target += 2;
  256. }
  257. else if (baseEnd >= endRange) {
  258. target += 2;
  259. }
  260. else {
  261. ThrowXML(RuntimeException, XMLExcepts::Regex_CompactRangesError);
  262. }
  263. } // inner while
  264. base += 2;
  265. }
  266. fElemCount = base;
  267. fCompacted = true;
  268. }
  269. void RangeToken::mergeRanges(const Token *const tok) {
  270. if (tok->getTokenType() != this->getTokenType())
  271. ThrowXML(IllegalArgumentException, XMLExcepts::Regex_MergeRangesTypeMismatch);
  272. RangeToken* rangeTok = (RangeToken *) tok;
  273. if (rangeTok->fRanges == 0)
  274. return;
  275. fCaseIToken = 0;
  276. sortRanges();
  277. rangeTok->sortRanges();
  278. if (fRanges == 0) {
  279. fMaxCount = rangeTok->fMaxCount;
  280. fRanges = (XMLInt32*) fMemoryManager->allocate
  281. (
  282. fMaxCount * sizeof(XMLInt32)
  283. );//new XMLInt32[fMaxCount];
  284. for (unsigned int index = 0; index < rangeTok->fElemCount; index++) {
  285. fRanges[index] = rangeTok->fRanges[index];
  286. }
  287. fElemCount = rangeTok->fElemCount;
  288. return;
  289. }
  290. unsigned int newMaxCount = (fElemCount + rangeTok->fElemCount >= fMaxCount)
  291. ? fMaxCount + rangeTok->fMaxCount : fMaxCount;
  292. XMLInt32* result = (XMLInt32*) fMemoryManager->allocate
  293. (
  294. newMaxCount * sizeof(XMLInt32)
  295. );//new XMLInt32[newMaxCount];
  296. for (unsigned int i=0, j=0, k=0; i < fElemCount || j < rangeTok->fElemCount;) {
  297. if (i >= fElemCount) {
  298. for (int count = 0; count < 2; count++) {
  299. result[k++] = rangeTok->fRanges[j++];
  300. }
  301. }
  302. else if (j >= rangeTok->fElemCount) {
  303. for (int count = 0; count < 2; count++) {
  304. result[k++] = fRanges[i++];
  305. }
  306. }
  307. else if (rangeTok->fRanges[j] < fRanges[i]
  308. || (rangeTok->fRanges[j] == fRanges[i]
  309. && rangeTok->fRanges[j+1] < fRanges[i+1])) {
  310. for (int count = 0; count < 2; count++) {
  311. result[k++] = rangeTok->fRanges[j++];
  312. }
  313. }
  314. else {
  315. for (int count = 0; count < 2; count++) {
  316. result[k++] = fRanges[i++];
  317. }
  318. }
  319. }
  320. fMemoryManager->deallocate(fRanges);//delete [] fRanges;
  321. fElemCount += rangeTok->fElemCount;
  322. fRanges = result;
  323. fMaxCount = newMaxCount;
  324. }
  325. void RangeToken::subtractRanges(RangeToken* const tok) {
  326. if (fRanges == 0 || tok->fRanges == 0)
  327. return;
  328. if (tok->getTokenType() == T_NRANGE) {
  329. intersectRanges(tok);
  330. return;
  331. }
  332. fCaseIToken = 0;
  333. sortRanges();
  334. compactRanges();
  335. tok->sortRanges();
  336. tok->compactRanges();
  337. unsigned int newMax = (fElemCount + tok->fElemCount >= fMaxCount)
  338. ? fMaxCount + tok->fMaxCount : fMaxCount;
  339. XMLInt32* result = (XMLInt32*) fMemoryManager->allocate
  340. (
  341. newMax * sizeof(XMLInt32)
  342. );//new XMLInt32[newMax];
  343. unsigned int newElemCount = 0;
  344. unsigned int srcCount = 0;
  345. unsigned int subCount = 0;
  346. while (srcCount < fElemCount && subCount < tok->fElemCount) {
  347. XMLInt32 srcBegin = fRanges[srcCount];
  348. XMLInt32 srcEnd = fRanges[srcCount + 1];
  349. XMLInt32 subBegin = tok->fRanges[subCount];
  350. XMLInt32 subEnd = tok->fRanges[subCount + 1];
  351. if (srcEnd < subBegin) { // no overlap
  352. result[newElemCount++] = fRanges[srcCount++];
  353. result[newElemCount++] = fRanges[srcCount++];
  354. }
  355. else if (srcEnd >= subBegin && srcBegin <= subEnd) {
  356. if (subBegin <= srcBegin && srcEnd <= subEnd) {
  357. srcCount += 2;
  358. }
  359. else if (subBegin <= srcBegin) {
  360. fRanges[srcCount] = subEnd + 1;
  361. subCount += 2;
  362. }
  363. else if (srcEnd <= subEnd) {
  364. result[newElemCount++] = srcBegin;
  365. result[newElemCount++] = subBegin - 1;
  366. srcCount += 2;
  367. }
  368. else {
  369. result[newElemCount++] = srcBegin;
  370. result[newElemCount++] = subBegin - 1;
  371. fRanges[srcCount] = subEnd + 1;
  372. subCount += 2;
  373. }
  374. }
  375. else if (subEnd < srcBegin) {
  376. subCount += 2;
  377. }
  378. else {
  379. fMemoryManager->deallocate(result);//delete [] result;
  380. ThrowXML(RuntimeException, XMLExcepts::Regex_SubtractRangesError);
  381. }
  382. } //end while
  383. while (srcCount < fElemCount) {
  384. result[newElemCount++] = fRanges[srcCount++];
  385. result[newElemCount++] = fRanges[srcCount++];
  386. }
  387. fMemoryManager->deallocate(fRanges);//delete [] fRanges;
  388. fRanges = result;
  389. fElemCount = newElemCount;
  390. fMaxCount = newMax;
  391. }
  392. /**
  393. * Ignore whether 'tok' is NRANGE or not.
  394. */
  395. void RangeToken::intersectRanges(RangeToken* const tok) {
  396. if (fRanges == 0 || tok->fRanges == 0)
  397. return;
  398. fCaseIToken = 0;
  399. sortRanges();
  400. compactRanges();
  401. tok->sortRanges();
  402. tok->compactRanges();
  403. unsigned int newMax = (fElemCount + tok->fElemCount >= fMaxCount)
  404. ? fMaxCount + tok->fMaxCount : fMaxCount;
  405. XMLInt32* result = (XMLInt32*) fMemoryManager->allocate
  406. (
  407. newMax * sizeof(XMLInt32)
  408. );//new XMLInt32[newMax];
  409. unsigned int newElemCount = 0;
  410. unsigned int srcCount = 0;
  411. unsigned int tokCount = 0;
  412. while (srcCount < fElemCount && tokCount < tok->fElemCount) {
  413. XMLInt32 srcBegin = fRanges[srcCount];
  414. XMLInt32 srcEnd = fRanges[srcCount + 1];
  415. XMLInt32 tokBegin = tok->fRanges[tokCount];
  416. XMLInt32 tokEnd = tok->fRanges[tokCount + 1];
  417. if (srcEnd < tokBegin) {
  418. srcCount += 2;
  419. }
  420. else if (srcEnd >= tokBegin && srcBegin <= tokEnd) {
  421. if (tokBegin <= srcBegin && srcEnd <= tokEnd) {
  422. result[newElemCount++] = srcBegin;
  423. result[newElemCount++] = srcEnd;
  424. srcCount += 2;
  425. }
  426. else if (tokBegin <= srcBegin) {
  427. result[newElemCount++] = srcBegin;
  428. result[newElemCount++] = tokEnd;
  429. tokCount += 2;
  430. if (tokCount < tok->fElemCount)
  431. fRanges[srcCount] = tokEnd + 1;
  432. else
  433. srcCount += 2;
  434. }
  435. else if (srcEnd <= tokEnd) {
  436. result[newElemCount++] = tokBegin;
  437. result[newElemCount++] = srcEnd;
  438. srcCount += 2;
  439. }
  440. else {
  441. result[newElemCount++] = tokBegin;
  442. result[newElemCount++] = tokEnd;
  443. tokCount += 2;
  444. if (tokCount < tok->fElemCount)
  445. fRanges[srcCount] = tokEnd + 1;
  446. else
  447. srcCount += 2;
  448. }
  449. }
  450. else if (tokEnd < srcBegin) {
  451. tokCount += 2;
  452. if (tokCount >= tok->fElemCount)
  453. srcCount += 2;
  454. }
  455. else {
  456. fMemoryManager->deallocate(result);//delete [] result;
  457. ThrowXML(RuntimeException, XMLExcepts::Regex_IntersectRangesError);
  458. }
  459. } //end while
  460. fMemoryManager->deallocate(fRanges);//delete [] fRanges;
  461. fRanges = result;
  462. fElemCount = newElemCount;
  463. fMaxCount = newMax;
  464. }
  465. /**
  466. * for RANGE: Creates complement.
  467. * for NRANGE: Creates the same meaning RANGE.
  468. */
  469. Token* RangeToken::complementRanges(RangeToken* const tok,
  470. TokenFactory* const tokFactory) {
  471. if (tok->getTokenType() != T_RANGE && tok->getTokenType() != T_NRANGE)
  472. ThrowXML(IllegalArgumentException, XMLExcepts::Regex_ComplementRangesInvalidArg);
  473. tok->sortRanges();
  474. tok->compactRanges();
  475. XMLInt32 lastElem = tok->fRanges[tok->fElemCount - 1];
  476. RangeToken* rangeTok = tokFactory->createRange();
  477. if (tok->fRanges[0] > 0) {
  478. rangeTok->addRange(0, tok->fRanges[0] - 1);
  479. }
  480. for (unsigned int i= 1; i< tok->fElemCount - 2; i += 2) {
  481. rangeTok->addRange(tok->fRanges[i] + 1, tok->fRanges[i+1] - 1);
  482. }
  483. if (lastElem != UTF16_MAX) {
  484. rangeTok->addRange(lastElem + 1, UTF16_MAX);
  485. }
  486. rangeTok->fCompacted = true;
  487. return rangeTok;
  488. }
  489. // ---------------------------------------------------------------------------
  490. // RangeToken: Match methods
  491. // ---------------------------------------------------------------------------
  492. bool RangeToken::match(const XMLInt32 ch) {
  493. if (fMap == 0)
  494. createMap();
  495. bool ret;
  496. if (getTokenType() == T_RANGE) {
  497. if (ch < MAPSIZE)
  498. return ((fMap[ch/32] & (1<<(ch&0x1f))) != 0);
  499. ret = false;
  500. for (unsigned int i= fNonMapIndex; i< fElemCount; i +=2) {
  501. if (fRanges[i] <= ch && ch <= fRanges[i+1])
  502. return true;
  503. }
  504. }
  505. else {
  506. if (ch < MAPSIZE)
  507. return ((fMap[ch/32] & (1<<(ch&0x1f))) == 0);
  508. ret = true;
  509. for (unsigned int i= fNonMapIndex; i< fElemCount; i += 2) {
  510. if (fRanges[i] <= ch && ch <= fRanges[i+1])
  511. return false;
  512. }
  513. }
  514. return ret;
  515. }
  516. // ---------------------------------------------------------------------------
  517. // RangeToken: Private helpers methods
  518. // ---------------------------------------------------------------------------
  519. void RangeToken::expand(const unsigned int length) {
  520. unsigned int newMax = fElemCount + length;
  521. // Avoid too many reallocations by expanding by a percentage
  522. unsigned int minNewMax = (unsigned int)((double)fElemCount * 1.25);
  523. if (newMax < minNewMax)
  524. newMax = minNewMax;
  525. XMLInt32* newList = (XMLInt32*) fMemoryManager->allocate
  526. (
  527. newMax * sizeof(XMLInt32)
  528. );//new XMLInt32[newMax];
  529. for (unsigned int index = 0; index < fElemCount; index++)
  530. newList[index] = fRanges[index];
  531. fMemoryManager->deallocate(fRanges);//delete [] fRanges;
  532. fRanges = newList;
  533. fMaxCount = newMax;
  534. }
  535. void RangeToken::createMap() {
  536. int asize = MAPSIZE/32;
  537. fMap = (int*) fMemoryManager->allocate(asize * sizeof(int));//new int[asize];
  538. fNonMapIndex = fElemCount;
  539. for (int i = 0; i < asize; i++) {
  540. fMap[i] = 0;
  541. }
  542. for (unsigned int j= 0; j < fElemCount; j += 2) {
  543. XMLInt32 begin = fRanges[j];
  544. XMLInt32 end = fRanges[j+1];
  545. if (begin < MAPSIZE) {
  546. for (int k = begin; k <= end && k < MAPSIZE; k++) {
  547. fMap[k/32] |= 1<<(k&0x1F);
  548. }
  549. }
  550. else {
  551. fNonMapIndex = j;
  552. break;
  553. }
  554. if (end >= MAPSIZE) {
  555. fNonMapIndex = j;
  556. break;
  557. }
  558. }
  559. }
  560. XERCES_CPP_NAMESPACE_END
  561. /**
  562. * End of file RangeToken.cpp
  563. */