dbertoni 02/05/05 22:31:58 Modified: c/src/XSLT AVT.cpp ElemAttribute.cpp ElemElement.cpp ElemLiteralResult.cpp ElemNumber.cpp ExtensionFunctionHandler.cpp FunctionElementAvailable.cpp FunctionFunctionAvailable.cpp FunctionGenerateID.cpp FunctionSystemProperty.cpp FunctionSystemProperty.hpp NamespacesHandler.cpp Stylesheet.cpp StylesheetHandler.cpp XSLTEngineImpl.cpp XSLTEngineImpl.hpp Log: More efficient string processing. Revision Changes Path 1.16 +1 -1 xml-xalan/c/src/XSLT/AVT.cpp Index: AVT.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/AVT.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- AVT.cpp 7 Dec 2001 19:58:10 -0000 1.15 +++ AVT.cpp 6 May 2002 05:31:57 -0000 1.16 @@ -403,7 +403,7 @@ { if (startsWith(theName, DOMServices::s_XMLNamespaceWithSeparator) == true) { - return substring(theName, DOMServices::s_XMLNamespaceWithSeparatorLength); + return XalanDOMString(theName, DOMServices::s_XMLNamespaceWithSeparatorLength); } else { 1.37 +5 -5 xml-xalan/c/src/XSLT/ElemAttribute.cpp Index: ElemAttribute.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemAttribute.cpp,v retrieving revision 1.36 retrieving revision 1.37 diff -u -r1.36 -r1.37 --- ElemAttribute.cpp 2 Apr 2002 06:12:50 -0000 1.36 +++ ElemAttribute.cpp 6 May 2002 05:31:57 -0000 1.37 @@ -239,7 +239,7 @@ attrName, length(attrName) - (indexOfNSSep + 1) + DOMServices::s_XMLNamespaceSeparatorStringLength + length(*prefix) + 1); - assign(attrName, substring(attrName, indexOfNSSep + 1)); + attrName.erase(0, indexOfNSSep + 1); } else { @@ -266,7 +266,7 @@ if(indexOfNSSep < origAttrNameLength && fPrefixIsXMLNS == false) { - newPrefix = substring(origAttrName, 0, indexOfNSSep); + substring(origAttrName, newPrefix, 0, indexOfNSSep); // OK, make sure that the prefix provided maps to // the same namespace as the one the user requested, @@ -283,7 +283,7 @@ clear(newPrefix); // Strip the user-supplied prefix from the name... - attrName = substring(origAttrName, indexOfNSSep + 1); + substring(origAttrName, attrName, indexOfNSSep + 1); } } @@ -293,7 +293,7 @@ // off... if (fPrefixIsXMLNS == true) { - assign(attrName, substring(attrName, indexOfNSSep + 1)); + attrName.erase(0, indexOfNSSep + 1); } // Get a new, unique namespace prefix... @@ -347,7 +347,7 @@ XalanDOMString& nsprefix = nsprefixGuard.get(); - nsprefix = substring(origAttrName, 0, indexOfNSSep); + substring(origAttrName, nsprefix, 0, indexOfNSSep); const XalanDOMString* const theNamespace = getNamespaceForPrefix(nsprefix); 1.37 +2 -2 xml-xalan/c/src/XSLT/ElemElement.cpp Index: ElemElement.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemElement.cpp,v retrieving revision 1.36 retrieving revision 1.37 diff -u -r1.36 -r1.37 --- ElemElement.cpp 2 Apr 2002 06:12:50 -0000 1.36 +++ ElemElement.cpp 6 May 2002 05:31:57 -0000 1.37 @@ -207,7 +207,7 @@ if (haveNamespace == true) { - prefix = substring(elemName, 0, indexOfNSSep); + substring(elemName, prefix, 0, indexOfNSSep); const XalanDOMString* const theNamespace = executionContext.getResultNamespaceForPrefix(prefix); @@ -232,7 +232,7 @@ { hasUnresolvedPrefix = true; - elemName = substring(elemName, indexOfNSSep + 1); + elemName.erase(0, indexOfNSSep + 1); } else { 1.48 +13 -12 xml-xalan/c/src/XSLT/ElemLiteralResult.cpp Index: ElemLiteralResult.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemLiteralResult.cpp,v retrieving revision 1.47 retrieving revision 1.48 diff -u -r1.47 -r1.48 --- ElemLiteralResult.cpp 23 Feb 2002 04:23:16 -0000 1.47 +++ ElemLiteralResult.cpp 6 May 2002 05:31:57 -0000 1.48 @@ -107,40 +107,41 @@ m_avts.reserve(nAttrs); + XalanDOMString theBuffer; + for(unsigned int i = 0; i < nAttrs; i++) { const XalanDOMChar* const aname = atts.getName(i); bool needToProcess = true; const XalanDOMString::size_type indexOfNSSep = indexOf(aname, XalanUnicode::charColon); + const XalanDOMString::size_type len = length(aname); - XalanDOMString prefix; - - if(indexOfNSSep < length(aname)) + if(indexOfNSSep < len) { - prefix = substring(aname, 0, indexOfNSSep); + substring(aname, theBuffer, 0, indexOfNSSep); - if(!equals(prefix, DOMServices::s_XMLNamespace)) + if(!equals(theBuffer, DOMServices::s_XMLNamespace)) { const XalanDOMString* const ns = - getNamespaceForPrefixInternal(prefix); + getNamespaceForPrefixInternal(theBuffer); if(ns == 0) { constructionContext.error( - "Cannot resolve namespace prefix: " + prefix, + "Cannot resolve namespace prefix", 0, this); } else if(equals(*ns, stylesheetTree.getXSLTNamespaceURI())) { - const XalanDOMString localName = substring(aname, indexOfNSSep + 1); + theBuffer.assign(aname + indexOfNSSep + 1, len - (indexOfNSSep + 1)); - if(processPrefixControl(constructionContext, stylesheetTree, localName, atts.getValue(i)) == true) + if(processPrefixControl(constructionContext, stylesheetTree, theBuffer, atts.getValue(i)) == true) { needToProcess = false; } - else if (equals(localName, Constants::ATTRNAME_VERSION) == true) + else if (equals(theBuffer, Constants::ATTRNAME_VERSION) == true) { const XalanDOMChar* const value = atts.getValue(i); @@ -223,7 +224,7 @@ if (theColonIndex != length(theName)) { - m_namespacesHandler.addActivePrefix(substring(theName, 0, theColonIndex)); + m_namespacesHandler.addActivePrefix(XalanDOMString(theName, 0, theColonIndex)); } } @@ -382,7 +383,7 @@ if(indexOfNSSep < length(attrName)) { - const XalanDOMString prefix = substring(attrName, 0, indexOfNSSep); + const XalanDOMString prefix(attrName, indexOfNSSep); const XalanDOMString* const ns = getStylesheet().getNamespaceForPrefixFromStack(prefix); 1.56 +1 -1 xml-xalan/c/src/XSLT/ElemNumber.cpp Index: ElemNumber.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemNumber.cpp,v retrieving revision 1.55 retrieving revision 1.56 diff -u -r1.55 -r1.56 --- ElemNumber.cpp 11 Apr 2002 05:54:50 -0000 1.55 +++ ElemNumber.cpp 6 May 2002 05:31:57 -0000 1.56 @@ -1664,7 +1664,7 @@ } } - return substring(*m_string, start, m_currentPosition); + return XalanDOMString(*m_string, start, m_currentPosition); } 1.9 +2 -2 xml-xalan/c/src/XSLT/ExtensionFunctionHandler.cpp Index: ExtensionFunctionHandler.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/ExtensionFunctionHandler.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- ExtensionFunctionHandler.cpp 21 Nov 2000 22:33:49 -0000 1.8 +++ ExtensionFunctionHandler.cpp 6 May 2002 05:31:57 -0000 1.9 @@ -186,13 +186,13 @@ { try { - XalanDOMString cname = m_scriptSrcURL; + XalanDOMString cname(m_scriptSrcURL); bool isClass = false; if (startsWith(m_scriptSrcURL, "class:")) { - cname = substring(m_scriptSrcURL, 6); + substring(m_scriptSrcURL, cname, 6); isClass = true; } 1.16 +11 -5 xml-xalan/c/src/XSLT/FunctionElementAvailable.cpp Index: FunctionElementAvailable.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionElementAvailable.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- FunctionElementAvailable.cpp 26 Sep 2001 21:30:23 -0000 1.15 +++ FunctionElementAvailable.cpp 6 May 2002 05:31:57 -0000 1.16 @@ -92,11 +92,17 @@ const XalanDOMString::size_type nameLength = length(fullName); const XalanDOMString::size_type indexOfNSSep = indexOf(fullName, XalanUnicode::charColon); - const XalanDOMString prefix = - indexOfNSSep < nameLength ? substring(fullName, 0, indexOfNSSep) : XalanDOMString(); + XPathExecutionContext::GetAndReleaseCachedString guard(executionContext); + + XalanDOMString& theBuffer = guard.get(); + + if (indexOfNSSep < nameLength) + { + substring(fullName, theBuffer, 0, indexOfNSSep); + } const XalanDOMString* const theNamespace = - executionContext.getNamespaceForPrefix(prefix); + executionContext.getNamespaceForPrefix(theBuffer); if (theNamespace == 0 || length(*theNamespace) == 0) { @@ -110,9 +116,9 @@ } else { - const XalanDOMString elementName = substring(fullName, indexOfNSSep + 1); + substring(fullName, theBuffer, indexOfNSSep + 1); - return executionContext.getXObjectFactory().createBoolean(executionContext.elementAvailable(*theNamespace, elementName)); + return executionContext.getXObjectFactory().createBoolean(executionContext.elementAvailable(*theNamespace, theBuffer)); } } } 1.15 +18 -5 xml-xalan/c/src/XSLT/FunctionFunctionAvailable.cpp Index: FunctionFunctionAvailable.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionFunctionAvailable.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- FunctionFunctionAvailable.cpp 26 Sep 2001 21:30:23 -0000 1.14 +++ FunctionFunctionAvailable.cpp 6 May 2002 05:31:57 -0000 1.15 @@ -96,20 +96,33 @@ const XalanDOMString::size_type nameLength = length(fullName); const XalanDOMString::size_type indexOfNSSep = indexOf(fullName, XalanUnicode::charColon); - const XalanDOMString prefix = indexOfNSSep < nameLength ? substring(fullName, 0, indexOfNSSep) : XalanDOMString(); + XPathExecutionContext::GetAndReleaseCachedString guard(executionContext); + + XalanDOMString& theBuffer = guard.get(); + + if (indexOfNSSep < nameLength) + { + substring(fullName, theBuffer, 0, indexOfNSSep); + } const XalanDOMString* theNamespace = - executionContext.getNamespaceForPrefix(prefix); + executionContext.getNamespaceForPrefix(theBuffer); if (theNamespace == 0) { theNamespace = &s_emptyString; } - const XalanDOMString functionName = - indexOfNSSep == nameLength ? fullName : substring(fullName, indexOfNSSep + 1); + if (indexOfNSSep == nameLength) + { + return executionContext.getXObjectFactory().createBoolean(executionContext.functionAvailable(*theNamespace, fullName)); + } + else + { + substring(fullName, theBuffer, indexOfNSSep + 1); - return executionContext.getXObjectFactory().createBoolean(executionContext.functionAvailable(*theNamespace, functionName)); + return executionContext.getXObjectFactory().createBoolean(executionContext.functionAvailable(*theNamespace, theBuffer)); + } } 1.22 +7 -5 xml-xalan/c/src/XSLT/FunctionGenerateID.cpp Index: FunctionGenerateID.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionGenerateID.cpp,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- FunctionGenerateID.cpp 6 Apr 2002 19:38:39 -0000 1.21 +++ FunctionGenerateID.cpp 6 May 2002 05:31:57 -0000 1.22 @@ -97,14 +97,16 @@ XalanDOMString& theResult) { assert(theNode != 0); - assert(theNode->getOwnerDocument() != 0); - - PointerToDOMString(theNode->getOwnerDocument(), theResult); - - append(theResult, XalanDOMChar(XalanUnicode::charFullStop)); // We're assuming here that each node has an implementation with a // unique address that we can convert into a string... + if (theNode->getOwnerDocument() != 0) + { + PointerToDOMString(theNode->getOwnerDocument(), theResult); + + append(theResult, XalanDOMChar(XalanUnicode::charFullStop)); + } + PointerToDOMString(theNode, theResult); } 1.24 +21 -11 xml-xalan/c/src/XSLT/FunctionSystemProperty.cpp Index: FunctionSystemProperty.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionSystemProperty.cpp,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- FunctionSystemProperty.cpp 11 Apr 2002 05:54:50 -0000 1.23 +++ FunctionSystemProperty.cpp 6 May 2002 05:31:57 -0000 1.24 @@ -74,7 +74,13 @@ FunctionSystemProperty::FunctionSystemProperty() : - Function() + Function(), + m_xsltNamespaceURI(XALAN_STATIC_UCODE_STRING("http://www.w3.org/1999/XSL/Transform")), + m_versionPropertyString(XALAN_STATIC_UCODE_STRING("version")), + m_vendorPropertyString(XALAN_STATIC_UCODE_STRING("vendor")), + m_vendorURLPropertyString(XALAN_STATIC_UCODE_STRING("vendor-url")), + m_vendorString(XALAN_STATIC_UCODE_STRING("Apache Software Foundation")), + m_vendorURLString(XALAN_STATIC_UCODE_STRING("http://xml.apache.org/xalan-c")) { } @@ -107,34 +113,38 @@ if(indexOfNSSep < fullNameLength) { - const XalanDOMString prefix = substring(fullName, 0, indexOfNSSep); + XPathExecutionContext::GetAndReleaseCachedString guard(executionContext); - const XalanDOMString* const nspace = executionContext.getNamespaceForPrefix(prefix); + XalanDOMString& theBuffer = guard.get(); + + substring(fullName, theBuffer, 0, indexOfNSSep); + + const XalanDOMString* const nspace = executionContext.getNamespaceForPrefix(theBuffer); if (nspace != 0) { - const XalanDOMString propName = substring(fullName, indexOfNSSep + 1); + substring(fullName, theBuffer, indexOfNSSep + 1); - if(startsWith(*nspace, XALAN_STATIC_UCODE_STRING("http://www.w3.org/1999/XSL/Transform"))) + if(startsWith(*nspace, m_xsltNamespaceURI)) { - if(equals(propName, XALAN_STATIC_UCODE_STRING("version"))) + if(equals(theBuffer, m_versionPropertyString)) { numberResult = 1.0; fNumberResult = true; } - else if(equals(propName, XALAN_STATIC_UCODE_STRING("vendor"))) + else if(equals(theBuffer, m_vendorPropertyString)) { - result = XALAN_STATIC_UCODE_STRING("Apache Software Foundation"); + result = m_vendorString; } - else if(equals(propName, XALAN_STATIC_UCODE_STRING("vendor-url"))) + else if(equals(theBuffer, m_vendorURLPropertyString)) { - result = XALAN_STATIC_UCODE_STRING("http://xml.apache.org/xalan-c"); + result = m_vendorURLString; } else { executionContext.error( - "XSL Property not supported: " + fullName, + "Unknown property in system-property()", context, locator); } 1.8 +9 -0 xml-xalan/c/src/XSLT/FunctionSystemProperty.hpp Index: FunctionSystemProperty.hpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionSystemProperty.hpp,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- FunctionSystemProperty.hpp 14 Sep 2001 20:49:43 -0000 1.7 +++ FunctionSystemProperty.hpp 6 May 2002 05:31:57 -0000 1.8 @@ -108,6 +108,15 @@ bool operator==(const FunctionSystemProperty&) const; + + + // Data members... + const XalanDOMString m_xsltNamespaceURI; + const XalanDOMString m_versionPropertyString; + const XalanDOMString m_vendorPropertyString; + const XalanDOMString m_vendorURLPropertyString; + const XalanDOMString m_vendorString; + const XalanDOMString m_vendorURLString; }; 1.19 +6 -2 xml-xalan/c/src/XSLT/NamespacesHandler.cpp Index: NamespacesHandler.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/NamespacesHandler.cpp,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- NamespacesHandler.cpp 19 Dec 2001 17:57:31 -0000 1.18 +++ NamespacesHandler.cpp 6 May 2002 05:31:57 -0000 1.19 @@ -321,8 +321,12 @@ // don't exclude its prefix. const XalanDOMString::size_type indexOfNSSep = indexOf(theElementName, XalanUnicode::charColon); - const XalanDOMString thePrefix = indexOfNSSep < length(theElementName) ? - substring(theElementName, 0, indexOfNSSep) : XalanDOMString(); + XalanDOMString thePrefix; + + if (indexOfNSSep < length(theElementName)) + { + substring(theElementName, thePrefix, 0, indexOfNSSep); + } processExcludeResultPrefixes(thePrefix); 1.75 +20 -9 xml-xalan/c/src/XSLT/Stylesheet.cpp Index: Stylesheet.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/Stylesheet.cpp,v retrieving revision 1.74 retrieving revision 1.75 diff -u -r1.74 -r1.75 --- Stylesheet.cpp 6 Apr 2002 19:38:39 -0000 1.74 +++ Stylesheet.cpp 6 May 2002 05:31:57 -0000 1.75 @@ -301,6 +301,8 @@ NamespaceVectorType namespaces; + XalanDOMString prefix; + for(unsigned int i = 0; i < nAttrs; i++) { const XalanDOMChar* const aname = atts.getName(i); @@ -310,9 +312,16 @@ if (equals(aname, DOMServices::s_XMLNamespace) || isPrefix) { - const XalanDOMString p = isPrefix ? substring(aname, 6) : XalanDOMString(); + if (isPrefix == false) + { + prefix.clear(); + } + else + { + substring(aname, prefix, DOMServices::s_XMLNamespaceWithSeparatorLength); + } - namespaces.push_back(NameSpace(p, XalanDOMString(value))); + namespaces.push_back(NameSpace(prefix, XalanDOMString(value))); } } @@ -480,7 +489,7 @@ if(indexOfNSSep < length(attrName)) { - const XalanDOMString prefix = substring(attrName, 0, indexOfNSSep); + const XalanDOMString prefix(attrName, indexOfNSSep); const XalanDOMString* ns = getNamespaceForPrefixFromStack(prefix); attrOK = ns != 0 && !::isEmpty(*ns) && !equals(*ns, constructionContext.getXSLTNamespaceURI()); @@ -503,12 +512,14 @@ const XalanDOMString::size_type indexOfNSSep = indexOf(nodeName, XalanUnicode::charColon); - const XalanDOMString prefix = - indexOfNSSep < length(nodeName) ? - substring(nodeName, 0, indexOfNSSep) : - XalanDOMString(); - - return getNamespaceForPrefixFromStack(prefix); + if (indexOfNSSep == length(nodeName)) + { + return getNamespaceForPrefixFromStack(s_emptyString); + } + else + { + return getNamespaceForPrefixFromStack(XalanDOMString(nodeName, indexOfNSSep)); + } } 1.77 +8 -3 xml-xalan/c/src/XSLT/StylesheetHandler.cpp Index: StylesheetHandler.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.cpp,v retrieving revision 1.76 retrieving revision 1.77 diff -u -r1.76 -r1.77 --- StylesheetHandler.cpp 28 Mar 2002 04:55:39 -0000 1.76 +++ StylesheetHandler.cpp 6 May 2002 05:31:57 -0000 1.77 @@ -370,11 +370,16 @@ const XalanDOMString::size_type nameLength = length(name); const XalanDOMString::size_type index = indexOf(name, XalanUnicode::charColon); - const XalanDOMString localName = index == nameLength ? XalanDOMString(name) : substring(name, index + 1); - - if(length(ns) == 0 && nameLength != length(localName)) + if(length(ns) == 0 && index < nameLength) { error("Could not resolve prefix.", locator); + } + + XalanDOMString localName(name, nameLength); + + if (index < nameLength) + { + localName.erase(0, index + 1); } ElemTemplateElement* elem = 0; 1.141 +110 -75 xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp Index: XSLTEngineImpl.cpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp,v retrieving revision 1.140 retrieving revision 1.141 diff -u -r1.140 -r1.141 --- XSLTEngineImpl.cpp 30 Apr 2002 04:43:23 -0000 1.140 +++ XSLTEngineImpl.cpp 6 May 2002 05:31:57 -0000 1.141 @@ -280,73 +280,62 @@ { // Didn't get a stylesheet from the input source, so look for a // stylesheet processing instruction... - XalanDOMString stylesheetURI; // The PI must be a child of the document... - XalanNode* child = sourceTree->getFirstChild(); + const XalanNode* child = sourceTree->getFirstChild(); -#if !defined(XALAN_NO_NAMESPACES) - using std::vector; -#endif + XalanDOMString theCurrentToken; + XalanDOMString theStylesheetURI; - vector<XalanDOMString> hrefs; + bool isOK = false; - const XalanDOMString stylesheetNodeName(XALAN_STATIC_UCODE_STRING("xml-stylesheet")); - const XalanDOMString typeString(XALAN_STATIC_UCODE_STRING("type")); - const XalanDOMString typeValueString1(XALAN_STATIC_UCODE_STRING("text/xml")); - const XalanDOMString typeValueString2(XALAN_STATIC_UCODE_STRING("text/xsl")); - const XalanDOMString typeValueString3(XALAN_STATIC_UCODE_STRING("application/xml")); - const XalanDOMString typeValueString4(XALAN_STATIC_UCODE_STRING("application/xml+xslt")); - - // $$$ ToDo: This code is much like that in getStyleSheetURIFromDoc(). - // Why is it repeated??? - // $$$ ToDo: Move these embedded strings from inside these loops - // out here... - // $$$ ToDo: These loops are a mess of repeated use of the - // same data values. - while(child != 0) + while(child != 0 && isOK == false && theStylesheetURI.empty() == true) { if(XalanNode::PROCESSING_INSTRUCTION_NODE == child->getNodeType()) { const XalanDOMString& nodeName = child->getNodeName(); - if(equals(nodeName, stylesheetNodeName)) + if(equals(nodeName, s_stylesheetNodeName)) { - bool isOK = false; + StringTokenizer tokenizer(child->getNodeValue(), s_piTokenizerString); - StringTokenizer tokenizer(child->getNodeValue(), XALAN_STATIC_UCODE_STRING(" \t=")); - - while(tokenizer.hasMoreTokens()) + while(tokenizer.hasMoreTokens() == true && (isOK == false || theStylesheetURI.empty() == true)) { - if(equals(tokenizer.nextToken(), typeString)) // "type" + tokenizer.nextToken(theCurrentToken); + + if(equals(theCurrentToken, s_typeString)) { - XalanDOMString typeVal = tokenizer.nextToken(); + tokenizer.nextToken(theCurrentToken); - typeVal = substring(typeVal, 1, length(typeVal) - 1); - if(equals(typeVal, typeValueString1) || - equals(typeVal, typeValueString2) || - equals(typeVal, typeValueString3) || - equals(typeVal, typeValueString4)) + const XalanDOMString::size_type theLength = + theCurrentToken.length(); + + if (theLength > 2) { - isOK = true; + theCurrentToken.erase(theLength - 1, 1); + theCurrentToken.erase(0, 1); + + if(equals(theCurrentToken, s_typeValueString1) || + equals(theCurrentToken, s_typeValueString2) || + equals(theCurrentToken, s_typeValueString3) || + equals(theCurrentToken, s_typeValueString4)) + { + isOK = true; + } } } - } - - if(isOK) - { - StringTokenizer tokenizer(child->getNodeValue(), XALAN_STATIC_UCODE_STRING(" \t=")); - - while(tokenizer.hasMoreTokens()) + else if(equals(theCurrentToken, s_hrefString)) { - const XalanDOMString theCurrentToken = tokenizer.nextToken(); + tokenizer.nextToken(theCurrentToken); + + const XalanDOMString::size_type theLength = + theCurrentToken.length(); - if(equals(theCurrentToken, XALAN_STATIC_UCODE_STRING("href"))) + if (theLength > 2) { - stylesheetURI = tokenizer.nextToken(); - stylesheetURI = substring(stylesheetURI, 1, length(stylesheetURI) - 1); - hrefs.push_back(stylesheetURI); + // Trim of the starting and trailing delimiters... + theStylesheetURI.assign(theCurrentToken, 1, theLength - 2); } } } @@ -356,36 +345,18 @@ child = child->getNextSibling(); } - bool isRoot = true; - Stylesheet* prevStylesheet = 0; - - if (hrefs.empty() == false) + if (isOK == true && theStylesheetURI.empty() == false) { const XalanDOMChar* const pxch = inputSource.getSystemId(); const XalanDOMString sysid(pxch == 0 ? &s_dummyString : pxch); - do - { - const XalanDOMString& ref = hrefs.back(); - - Stylesheet* stylesheet = - getStylesheetFromPIURL( - ref, - *sourceTree, - sysid, - isRoot, - constructionContext); - - if(false == isRoot) - { - prevStylesheet->addImport(stylesheet, false); - } - - prevStylesheet = stylesheet; - isRoot = false; - hrefs.pop_back(); - } while(!hrefs.empty()); + getStylesheetFromPIURL( + theStylesheetURI, + *sourceTree, + sysid, + true, + constructionContext); } } @@ -686,7 +657,7 @@ { diag("Locating stylesheet from fragment identifier..."); - const XalanDOMString fragID = substring(localXSLURLString, 1); + const XalanDOMString fragID(localXSLURLString, 1); const XalanElement* nsNode = 0; @@ -1772,7 +1743,7 @@ XalanDOMString& prefix = prefixGuard.get(); - prefix = substring(aname, DOMServices::s_XMLNamespaceWithSeparatorLength); + substring(aname, prefix, DOMServices::s_XMLNamespaceWithSeparatorLength); const XalanDOMString* const theNamespace = getResultNamespaceForPrefix(prefix); @@ -3432,11 +3403,28 @@ -static XalanDOMString s_XSLNameSpaceURL; +static XalanDOMString s_XSLNameSpaceURL; + +static XalanDOMString s_XSLT4JNameSpaceURL; + +static XalanDOMString s_uniqueNamespacePrefix; + +static XalanDOMString s_stylesheetNodeName; + +static XalanDOMString s_typeString; + +static XalanDOMString s_hrefString; + +static XalanDOMString s_piTokenizerString; + +static XalanDOMString s_typeValueString1; -static XalanDOMString s_XSLT4JNameSpaceURL; +static XalanDOMString s_typeValueString2; + +static XalanDOMString s_typeValueString3; + +static XalanDOMString s_typeValueString4; -static XalanDOMString s_uniqueNamespacePrefix; static XSLTEngineImpl::AttributeKeysMapType s_attributeKeys; @@ -3452,6 +3440,21 @@ const XalanDOMString& XSLTEngineImpl::s_uniqueNamespacePrefix = ::s_uniqueNamespacePrefix; +const XalanDOMString& XSLTEngineImpl::s_stylesheetNodeName = ::s_stylesheetNodeName; + +const XalanDOMString& XSLTEngineImpl::s_typeString = ::s_typeString; + +const XalanDOMString& XSLTEngineImpl::s_hrefString = ::s_hrefString; + +const XalanDOMString& XSLTEngineImpl::s_piTokenizerString = ::s_piTokenizerString; + +const XalanDOMString& XSLTEngineImpl::s_typeValueString1 = ::s_typeValueString1; + +const XalanDOMString& XSLTEngineImpl::s_typeValueString2 = ::s_typeValueString2; + +const XalanDOMString& XSLTEngineImpl::s_typeValueString3 = ::s_typeValueString3; + +const XalanDOMString& XSLTEngineImpl::s_typeValueString4 = ::s_typeValueString4; const XSLTEngineImpl::AttributeKeysMapType& XSLTEngineImpl::s_attributeKeys = ::s_attributeKeys; @@ -3468,6 +3471,22 @@ ::s_uniqueNamespacePrefix = XALAN_STATIC_UCODE_STRING("ns"); + ::s_stylesheetNodeName = XALAN_STATIC_UCODE_STRING("xml-stylesheet"); + + ::s_typeString = XALAN_STATIC_UCODE_STRING("type"); + + ::s_hrefString = XALAN_STATIC_UCODE_STRING("href"); + + ::s_piTokenizerString = XALAN_STATIC_UCODE_STRING(" \t="); + + ::s_typeValueString1 = XALAN_STATIC_UCODE_STRING("text/xml"); + + ::s_typeValueString2 = XALAN_STATIC_UCODE_STRING("text/xsl"); + + ::s_typeValueString3 = XALAN_STATIC_UCODE_STRING("application/xml"); + + ::s_typeValueString4 = XALAN_STATIC_UCODE_STRING("application/xml+xslt"); + installFunctions(); initializeAttributeKeysTable(::s_attributeKeys); @@ -3491,4 +3510,20 @@ releaseMemory(::s_XSLT4JNameSpaceURL); releaseMemory(::s_XSLNameSpaceURL); + + releaseMemory(::s_stylesheetNodeName); + + releaseMemory(::s_typeString); + + releaseMemory(::s_hrefString); + + releaseMemory(::s_piTokenizerString); + + releaseMemory(::s_typeValueString1); + + releaseMemory(::s_typeValueString2); + + releaseMemory(::s_typeValueString3); + + releaseMemory(::s_typeValueString4); } 1.86 +10 -1 xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp Index: XSLTEngineImpl.hpp =================================================================== RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp,v retrieving revision 1.85 retrieving revision 1.86 diff -u -r1.85 -r1.86 --- XSLTEngineImpl.hpp 30 Apr 2002 04:43:23 -0000 1.85 +++ XSLTEngineImpl.hpp 6 May 2002 05:31:57 -0000 1.86 @@ -1668,7 +1668,16 @@ static const XalanDOMString s_emptyString; - // Not implemented... + static const XalanDOMString& s_stylesheetNodeName; + static const XalanDOMString& s_typeString; + static const XalanDOMString& s_hrefString; + static const XalanDOMString& s_piTokenizerString; + static const XalanDOMString& s_typeValueString1; + static const XalanDOMString& s_typeValueString2; + static const XalanDOMString& s_typeValueString3; + static const XalanDOMString& s_typeValueString4; + + // Not implemented... XSLTEngineImpl(const XSLTEngineImpl&); XSLTEngineImpl&
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]