From feba619e355a3085936bfa6d586dfbf957279910 Mon Sep 17 00:00:00 2001 From: Alberto Massari <amassari@apache.org> Date: Fri, 21 Aug 2009 09:19:38 +0000 Subject: [PATCH] Added optimizations forgotten in previous commit, plus tests git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@806472 13f79535-47bb-0310-9956-ffa450edef68 --- src/xercesc/util/XMLString.cpp | 69 +++------- src/xercesc/util/XMLString.hpp | 2 +- .../validators/schema/TraverseSchema.cpp | 42 +++--- tests/src/DOM/DOMTest/DTest.cpp | 130 +++++++++++++++++- tests/src/DOM/DOMTest/DTest.h | 1 + 5 files changed, 173 insertions(+), 71 deletions(-) diff --git a/src/xercesc/util/XMLString.cpp b/src/xercesc/util/XMLString.cpp index 8b18c4489..0f589a519 100644 --- a/src/xercesc/util/XMLString.cpp +++ b/src/xercesc/util/XMLString.cpp @@ -1854,35 +1854,20 @@ bool XMLString::isWSReplaced(const XMLCh* const toCheck) void XMLString::replaceWS(XMLCh* toConvert , MemoryManager* const manager) { - XMLSize_t strLen = XMLString::stringLen(toConvert); - if (strLen == 0) + // If no string, then its a OK + if (( !toConvert ) || ( !*toConvert )) return; - XMLCh* retBuf = (XMLCh*) manager->allocate - ( - (strLen+1) * sizeof(XMLCh) - );//new XMLCh[strLen+1]; - XMLCh* retPtr = &retBuf[0]; - XMLCh* startPtr = toConvert; - - while ( *startPtr ) + XMLCh* cursorPtr = toConvert; + while ( *cursorPtr ) { - if ( ( *startPtr == chCR) || - ( *startPtr == chLF) || - ( *startPtr == chHTab)) - *retPtr = chSpace; - else - *retPtr = *startPtr; + if ( ( *cursorPtr == chCR) || + ( *cursorPtr == chLF) || + ( *cursorPtr == chHTab)) + *cursorPtr = chSpace; - retPtr++; - startPtr++; + cursorPtr++; } - - retBuf[strLen] = chNull; - - XMLString::moveChars(toConvert, retBuf, strLen); - manager->deallocate(retBuf);//delete[] retBuf; - return; } // @@ -1960,31 +1945,27 @@ void XMLString::collapseWS(XMLCh* toConvert endPtr--; *endPtr = chNull; - XMLString::moveChars(toConvert, startPtr, endPtr - startPtr + 1); + // move data to beginning only if there were spaces in front + if(startPtr != toConvert) + XMLString::moveChars(toConvert, startPtr, endPtr - startPtr + 1); + if(!isWSCollapsed(toConvert)) { // // Work through what remains and chop continuous spaces // - XMLCh* retBuf = (XMLCh*) manager->allocate - ( - (stringLen(toConvert) + 1) * sizeof(XMLCh) - ); - XMLCh* retPtr = &retBuf[0]; - bool inSpace = false; + XMLCh* retPtr = toConvert; startPtr = toConvert; + bool inSpace = false; while (*startPtr) { if ( *startPtr == chSpace) { - if (inSpace) - { - //discard it; - } - else + // copy a single space, then ignore subsequent + if (!inSpace) { inSpace = true; - *retPtr++ = chSpace; //copy the first chSpace + *retPtr++ = chSpace; } } else @@ -1997,26 +1978,20 @@ void XMLString::collapseWS(XMLCh* toConvert } *retPtr = chNull; - XMLString::moveChars(toConvert, retBuf, stringLen(retBuf)+1); //copy the last chNull as well - manager->deallocate(retBuf); } } // // remove whitespace // -void XMLString::removeWS(XMLCh* const toConvert +void XMLString::removeWS(XMLCh* toConvert , MemoryManager* const manager) { // If no string, then its a failure if (( !toConvert ) || ( !*toConvert )) return; - XMLCh* retBuf = (XMLCh*) manager->allocate - ( - (XMLString::stringLen(toConvert) + 1) * sizeof(XMLCh) - );//new XMLCh[ XMLString::stringLen(toConvert) + 1]; - XMLCh* retPtr = &retBuf[0]; + XMLCh* retPtr = toConvert; XMLCh* startPtr = toConvert; while (*startPtr) @@ -2030,13 +2005,9 @@ void XMLString::removeWS(XMLCh* const toConvert } startPtr++; - } *retPtr = chNull; - XMLString::moveChars(toConvert, retBuf, stringLen(retBuf)+1); //copy the last chNull as well - manager->deallocate(retBuf);//delete[] retBuf; - return; } void XMLString::removeChar(const XMLCh* const srcString diff --git a/src/xercesc/util/XMLString.hpp b/src/xercesc/util/XMLString.hpp index b16ff0dbc..2db9e9469 100644 --- a/src/xercesc/util/XMLString.hpp +++ b/src/xercesc/util/XMLString.hpp @@ -1433,7 +1433,7 @@ public: * On return , this buffer also holds the converted string * @param manager The MemoryManager to use to allocate objects */ - static void removeWS(XMLCh* const toConvert + static void removeWS(XMLCh* toConvert , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp index 3f6bd1a2a..d8777b6c2 100644 --- a/src/xercesc/validators/schema/TraverseSchema.cpp +++ b/src/xercesc/validators/schema/TraverseSchema.cpp @@ -9357,26 +9357,28 @@ const XMLCh* TraverseSchema::getElementAttValue(const DOMElement* const elem, static short wsFacets[DatatypeValidator::ID] = {0}; if(!bInitialized) { - wsFacets[DatatypeValidator::String]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_STRING)->getWSFacet(); - wsFacets[DatatypeValidator::AnyURI]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_ANYURI)->getWSFacet(); - wsFacets[DatatypeValidator::QName]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME)->getWSFacet(); - wsFacets[DatatypeValidator::Name]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_NAME)->getWSFacet(); - wsFacets[DatatypeValidator::NCName]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_NCNAME)->getWSFacet(); - wsFacets[DatatypeValidator::Boolean]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BOOLEAN)->getWSFacet(); - wsFacets[DatatypeValidator::Float]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_FLOAT)->getWSFacet(); - wsFacets[DatatypeValidator::Double]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_DOUBLE)->getWSFacet(); - wsFacets[DatatypeValidator::Decimal]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_DECIMAL)->getWSFacet(); - wsFacets[DatatypeValidator::HexBinary]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_HEXBINARY)->getWSFacet(); - wsFacets[DatatypeValidator::Base64Binary]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BASE64BINARY)->getWSFacet(); - wsFacets[DatatypeValidator::Duration]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_DURATION)->getWSFacet(); - wsFacets[DatatypeValidator::DateTime]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_DATETIME)->getWSFacet(); - wsFacets[DatatypeValidator::Date]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_DATE)->getWSFacet(); - wsFacets[DatatypeValidator::Time]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_TIME)->getWSFacet(); - wsFacets[DatatypeValidator::MonthDay]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_MONTHDAY)->getWSFacet(); - wsFacets[DatatypeValidator::YearMonth]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_YEARMONTH)->getWSFacet(); - wsFacets[DatatypeValidator::Year]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_YEAR)->getWSFacet(); - wsFacets[DatatypeValidator::Month]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_MONTH)->getWSFacet(); - wsFacets[DatatypeValidator::Day]=DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_DAY)->getWSFacet(); + bInitialized=true; + DVHashTable* registry = DatatypeValidatorFactory::getBuiltInRegistry(); + wsFacets[DatatypeValidator::String] = registry->get(SchemaSymbols::fgDT_STRING)->getWSFacet(); + wsFacets[DatatypeValidator::AnyURI] = registry->get(SchemaSymbols::fgDT_ANYURI)->getWSFacet(); + wsFacets[DatatypeValidator::QName] = registry->get(SchemaSymbols::fgDT_QNAME)->getWSFacet(); + wsFacets[DatatypeValidator::Name] = registry->get(SchemaSymbols::fgDT_NAME)->getWSFacet(); + wsFacets[DatatypeValidator::NCName] = registry->get(SchemaSymbols::fgDT_NCNAME)->getWSFacet(); + wsFacets[DatatypeValidator::Boolean] = registry->get(SchemaSymbols::fgDT_BOOLEAN)->getWSFacet(); + wsFacets[DatatypeValidator::Float] = registry->get(SchemaSymbols::fgDT_FLOAT)->getWSFacet(); + wsFacets[DatatypeValidator::Double] = registry->get(SchemaSymbols::fgDT_DOUBLE)->getWSFacet(); + wsFacets[DatatypeValidator::Decimal] = registry->get(SchemaSymbols::fgDT_DECIMAL)->getWSFacet(); + wsFacets[DatatypeValidator::HexBinary] = registry->get(SchemaSymbols::fgDT_HEXBINARY)->getWSFacet(); + wsFacets[DatatypeValidator::Base64Binary]= registry->get(SchemaSymbols::fgDT_BASE64BINARY)->getWSFacet(); + wsFacets[DatatypeValidator::Duration] = registry->get(SchemaSymbols::fgDT_DURATION)->getWSFacet(); + wsFacets[DatatypeValidator::DateTime] = registry->get(SchemaSymbols::fgDT_DATETIME)->getWSFacet(); + wsFacets[DatatypeValidator::Date] = registry->get(SchemaSymbols::fgDT_DATE)->getWSFacet(); + wsFacets[DatatypeValidator::Time] = registry->get(SchemaSymbols::fgDT_TIME)->getWSFacet(); + wsFacets[DatatypeValidator::MonthDay] = registry->get(SchemaSymbols::fgDT_MONTHDAY)->getWSFacet(); + wsFacets[DatatypeValidator::YearMonth] = registry->get(SchemaSymbols::fgDT_YEARMONTH)->getWSFacet(); + wsFacets[DatatypeValidator::Year] = registry->get(SchemaSymbols::fgDT_YEAR)->getWSFacet(); + wsFacets[DatatypeValidator::Month] = registry->get(SchemaSymbols::fgDT_MONTH)->getWSFacet(); + wsFacets[DatatypeValidator::Day] = registry->get(SchemaSymbols::fgDT_DAY)->getWSFacet(); } short wsFacet = wsFacets[attType]; if((wsFacet == DatatypeValidator::REPLACE && !XMLString::isWSReplaced(attValue)) || diff --git a/tests/src/DOM/DOMTest/DTest.cpp b/tests/src/DOM/DOMTest/DTest.cpp index 896b104b2..37f20963a 100644 --- a/tests/src/DOM/DOMTest/DTest.cpp +++ b/tests/src/DOM/DOMTest/DTest.cpp @@ -950,6 +950,8 @@ int main(int /*argc*/, char ** /*argv*/) OK &= test.testLSExceptions(); OK &= test.testElementTraversal(); + + OK &= test.testUtilFunctions(); } XMLPlatformUtils::Terminate(); @@ -2743,11 +2745,27 @@ bool DOMTest::testDOMerrors(DOMDocument* document) { OK = false; \ } +#include <xercesc/framework/StdOutFormatTarget.hpp> + bool DOMTest::testXPath(DOMDocument* document) { bool OK = true; +#if 0 + XMLCh tempLS[3] = {chLatin_L, chLatin_S, chNull}; + DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(tempLS); + DOMLSSerializer *theSerializer = ((DOMImplementationLS*)impl)->createLSSerializer(); + DOMLSOutput *theOutputDesc = ((DOMImplementationLS*)impl)->createLSOutput(); + StdOutFormatTarget myFormTarget; + theOutputDesc->setByteStream(&myFormTarget); + theSerializer->getDomConfig()->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true); + theSerializer->write(document, theOutputDesc); + + theOutputDesc->release(); + theSerializer->release(); +#endif + TEST_VALID_XPATH("*", 1, __LINE__); - TEST_VALID_XPATH("dFirstElement/dTestBody/dBodyLevel24", 1, __LINE__); + TEST_VALID_XPATH("dTestBody/dBodyLevel24", 1, __LINE__); TEST_VALID_XPATH("//dBodyLevel34", 1, __LINE__); TEST_VALID_XPATH("/*", 1, __LINE__); TEST_VALID_XPATH("/dFirstElement/dTestBody/dBodyLevel24", 1, __LINE__); @@ -5482,3 +5500,113 @@ bool DOMTest::testScanner(XercesDOMParser* parser) { return OK; } + +#define TEST_BOOLEAN(x) \ + if(!x) \ + { \ + fprintf(stderr, "Boolean expression test failed at line %i\n", __LINE__); \ + OK = false; \ + } + +#define TEST_STRING(x,y) \ + if(!XMLString::equals(x,y)) \ + { \ + fprintf(stderr, "String expression test failed at line %i\n", __LINE__); \ + OK = false; \ + } + +bool DOMTest::testUtilFunctions() +{ + bool OK = true; + // test isWSReplaced + XMLString::transcode(" xyz ", tempStr, 3999); + TEST_BOOLEAN(XMLString::isWSReplaced(tempStr)); + XMLString::transcode(" x\tyz ", tempStr, 3999); + TEST_BOOLEAN(!XMLString::isWSReplaced(tempStr)); + XMLString::transcode(" xyz\n", tempStr, 3999); + TEST_BOOLEAN(!XMLString::isWSReplaced(tempStr)); + XMLString::transcode("\rxyz", tempStr, 3999); + TEST_BOOLEAN(!XMLString::isWSReplaced(tempStr)); + + // test replaceWS + XMLString::transcode(" x yz ", tempStr2, 3999); + XMLString::transcode(" x yz ", tempStr, 3999); + XMLString::replaceWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode(" x\tyz ", tempStr, 3999); + XMLString::replaceWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode(" x yz\n", tempStr, 3999); + XMLString::replaceWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode("\rx yz ", tempStr, 3999); + XMLString::replaceWS(tempStr); + TEST_STRING(tempStr, tempStr2); + + // test isWSCollapsed + XMLString::transcode(" xyz ", tempStr, 3999); + TEST_BOOLEAN(!XMLString::isWSCollapsed(tempStr)); + XMLString::transcode(" x\tyz ", tempStr, 3999); + TEST_BOOLEAN(!XMLString::isWSCollapsed(tempStr)); + XMLString::transcode(" xyz\n", tempStr, 3999); + TEST_BOOLEAN(!XMLString::isWSCollapsed(tempStr)); + XMLString::transcode("\rxyz", tempStr, 3999); + TEST_BOOLEAN(!XMLString::isWSCollapsed(tempStr)); + XMLString::transcode("xyz", tempStr, 3999); + TEST_BOOLEAN(XMLString::isWSCollapsed(tempStr)); + XMLString::transcode("x yz", tempStr, 3999); + TEST_BOOLEAN(XMLString::isWSCollapsed(tempStr)); + XMLString::transcode("x yz", tempStr, 3999); + TEST_BOOLEAN(!XMLString::isWSCollapsed(tempStr)); + + // test collapseWS + XMLString::transcode("x yz", tempStr2, 3999); + XMLString::transcode(" x\tyz ", tempStr, 3999); + XMLString::collapseWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode("x yz", tempStr, 3999); + XMLString::collapseWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode("x yz", tempStr, 3999); + XMLString::collapseWS(tempStr); + TEST_STRING(tempStr, tempStr2); + + XMLString::transcode("xyz", tempStr2, 3999); + XMLString::transcode(" xyz ", tempStr, 3999); + XMLString::collapseWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode(" xyz\n", tempStr, 3999); + XMLString::collapseWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode("\rxyz", tempStr, 3999); + XMLString::collapseWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode("xyz", tempStr, 3999); + XMLString::collapseWS(tempStr); + TEST_STRING(tempStr, tempStr2); + + XMLString::transcode("xyz", tempStr2, 3999); + XMLString::transcode(" x\tyz ", tempStr, 3999); + XMLString::removeWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode("x yz", tempStr, 3999); + XMLString::removeWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode("x yz", tempStr, 3999); + XMLString::removeWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode(" xyz ", tempStr, 3999); + XMLString::removeWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode(" xyz\n", tempStr, 3999); + XMLString::removeWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode("\rxyz", tempStr, 3999); + XMLString::removeWS(tempStr); + TEST_STRING(tempStr, tempStr2); + XMLString::transcode("xyz", tempStr, 3999); + XMLString::removeWS(tempStr); + TEST_STRING(tempStr, tempStr2); + + return OK; +} diff --git a/tests/src/DOM/DOMTest/DTest.h b/tests/src/DOM/DOMTest/DTest.h index 3fff7a294..18ea6af95 100644 --- a/tests/src/DOM/DOMTest/DTest.h +++ b/tests/src/DOM/DOMTest/DTest.h @@ -112,6 +112,7 @@ bool testElementTraversal(); bool testRegex(); bool testScanner(XercesDOMParser* parser); +bool testUtilFunctions(); }; -- GitLab