dbertoni 01/03/02 11:08:54
Modified: c/src/XalanSourceTree FormatterToSourceTree.cpp
FormatterToSourceTree.hpp
XalanSourceTreeDocument.cpp
XalanSourceTreeDocument.hpp
Log:
Added PrefixResolver support.
Revision Changes Path
1.4 +27 -3 xml-xalan/c/src/XalanSourceTree/FormatterToSourceTree.cpp
Index: FormatterToSourceTree.cpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/XalanSourceTree/FormatterToSourceTree.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FormatterToSourceTree.cpp 2001/02/08 21:16:10 1.3
+++ FormatterToSourceTree.cpp 2001/03/02 19:08:30 1.4
@@ -76,6 +76,10 @@
+#include <DOMSupport/PrefixResolver.hpp>
+
+
+
#include <XMLSupport/FormatterToDOM.hpp>
@@ -94,7 +98,8 @@
m_documentFragment(0),
m_currentElement(0),
m_elementStack(),
- m_textBuffer()
+ m_textBuffer(),
+ m_prefixResolver(0)
{
assert(m_document != 0);
}
@@ -109,7 +114,8 @@
m_documentFragment(theDocumentFragment),
m_currentElement(0),
m_elementStack(),
- m_textBuffer()
+ m_textBuffer(),
+ m_prefixResolver(0)
{
assert(m_document != 0);
assert(m_documentFragment != 0);
@@ -153,7 +159,7 @@
AttributeList& attrs)
{
XalanSourceTreeElement* const theNewElement =
- m_document->createElementNode(name, attrs, m_currentElement);
+ createElementNode(name, attrs, m_currentElement);
if (m_currentElement != 0)
{
@@ -366,6 +372,24 @@
else
{
throw
XalanDOMException(XalanDOMException::HIERARCHY_REQUEST_ERR);
+ }
+}
+
+
+
+XalanSourceTreeElement*
+FormatterToSourceTree::createElementNode(
+ const XalanDOMChar* name,
+ AttributeList& attrs,
+ XalanSourceTreeElement* theParentElement)
+{
+ if (m_prefixResolver != 0)
+ {
+ return m_document->createElementNode(name, attrs,
*m_prefixResolver, theParentElement);
+ }
+ else
+ {
+ return m_document->createElementNode(name, attrs,
theParentElement);
}
}
1.4 +25 -4 xml-xalan/c/src/XalanSourceTree/FormatterToSourceTree.hpp
Index: FormatterToSourceTree.hpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/XalanSourceTree/FormatterToSourceTree.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FormatterToSourceTree.hpp 2001/02/08 21:16:13 1.3
+++ FormatterToSourceTree.hpp 2001/03/02 19:08:35 1.4
@@ -77,6 +77,7 @@
+class PrefixResolver;
class XalanDocument;
class XalanDocumentFragment;
class XalanElement;
@@ -130,6 +131,18 @@
~FormatterToSourceTree();
+ const PrefixResolver*
+ getPrefixResolver() const
+ {
+ return m_prefixResolver;
+ }
+
+ void
+ setPrefixResolver(const PrefixResolver* thePrefixResolver)
+ {
+ m_prefixResolver = thePrefixResolver;
+ }
+
// These methods are inherited from DocumentHandler ...
virtual void
@@ -225,15 +238,21 @@
void
processAccumulatedText();
+ XalanSourceTreeElement*
+ createElementNode(
+ const XalanDOMChar* name,
+ AttributeList& attrs,
+ XalanSourceTreeElement* theParentElement);
+
void
doCharacters(
- const XMLCh* chars,
- unsigned int length);
+ const XalanDOMChar* chars,
+ unsigned int length);
void
doProcessingInstruction(
- const XMLCh* target,
- const XMLCh* data);
+ const XalanDOMChar* target,
+ const XalanDOMChar* data);
// Data members...
@@ -252,6 +271,8 @@
ElementStackType
m_elementStack;
XalanDOMString
m_textBuffer;
+
+ const PrefixResolver*
m_prefixResolver;
};
1.11 +114 -22
xml-xalan/c/src/XalanSourceTree/XalanSourceTreeDocument.cpp
Index: XalanSourceTreeDocument.cpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/XalanSourceTree/XalanSourceTreeDocument.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- XalanSourceTreeDocument.cpp 2001/02/12 19:34:40 1.10
+++ XalanSourceTreeDocument.cpp 2001/03/02 19:08:38 1.11
@@ -71,6 +71,10 @@
+#include <DOMSupport/PrefixResolver.hpp>
+
+
+
#include "XalanSourceTreeHelper.hpp"
@@ -97,7 +101,8 @@
m_poolAllText(fPoolAllText),
m_elementsByID(),
m_unparsedEntityURIs(),
- m_nonPooledStrings()
+ m_nonPooledStrings(),
+ m_stringBuffer()
{
}
@@ -582,6 +587,61 @@
+XalanSourceTreeElement*
+XalanSourceTreeDocument::createElementNode(
+ const XalanDOMChar* tagName,
+ const AttributeList& attrs,
+ const PrefixResolver& thePrefixResolver,
+ XalanSourceTreeElement* theParentElement,
+ XalanNode*
thePreviousSibling,
+ XalanNode*
theNextSibling)
+{
+ // We might have typedef'ed this to something smaller than unsigned int.
+ const AttributesCountType theAttributeCount =
AttributesCountType(attrs.getLength());
+
+ // assert that we didn't lose anything...
+ assert(theAttributeCount == attrs.getLength());
+
+ XalanSourceTreeAttr** const theAttributeVector =
+ theAttributeCount == 0 ? 0 :
m_attributesVector.allocate(theAttributeCount);
+
+ XalanSourceTreeElement* const theNewElement =
+ createElement(
+ tagName,
+ theAttributeVector,
+ theAttributeCount,
+ theParentElement,
+ thePreviousSibling,
+ theNextSibling,
+ thePrefixResolver);
+ assert(theNewElement != 0);
+
+ // Now, create the attributes...
+ for(AttributesCountType i = 0; i < theAttributeCount; ++i)
+ {
+ const XalanDOMChar* const theName =
+ attrs.getName(i);
+ assert(theName != 0);
+
+ const XalanDOMChar* const theValue =
+ attrs.getValue(i);
+ assert(theValue != 0);
+
+ theAttributeVector[i] =
+ createAttribute(
+ theName,
+ theValue,
+ theNewElement,
+ thePrefixResolver);
+
+ assert(theAttributeVector[i] != 0);
+ }
+
+ return theNewElement;
+}
+
+
+
inline const XalanDOMString&
getElementNodePrefix(
const XalanDOMChar* qname,
@@ -759,6 +819,33 @@
+const XalanDOMString&
+XalanSourceTreeDocument::getNamespaceForPrefix(
+ const XalanDOMChar* theName,
+ const PrefixResolver& thePrefixResolver,
+ XalanDOMString& thePrefix)
+{
+ const unsigned int theLength = length(theName);
+ const unsigned int theColonIndex = indexOf(theName,
XalanUnicode::charColon);
+
+ if (theColonIndex == theLength)
+ {
+ clear(thePrefix);
+
+ return thePrefixResolver.getNamespaceForPrefix(s_emptyString);
+ }
+ else
+ {
+ // Get the prefix from theName...
+ assign(thePrefix, theName, theColonIndex);
+ assert(length(thePrefix) != 0);
+
+ return thePrefixResolver.getNamespaceForPrefix(thePrefix);
+ }
+}
+
+
+
XalanSourceTreeText*
XalanSourceTreeDocument::createTextNode(
const XalanDOMChar* chars,
@@ -843,19 +930,21 @@
-#if 0
-// Commented out for now, since we need a way to get namespace URIs. (Like
Stylesheet does).
XalanSourceTreeAttr*
XalanSourceTreeDocument::createAttribute(
const XalanDOMChar* theName,
const XalanDOMChar* theValue,
- XalanSourceTreeElement* theOwnerElement)
+ XalanSourceTreeElement* theOwnerElement,
+ const PrefixResolver& thePrefixResolver)
{
- const unsigned int theLength = length(theName);
- const unsigned int theColonIndex = indexOf(theName,
XalanUnicode::charColon);
+ const XalanDOMString& theNamespace =
+ getNamespaceForPrefix(theName, thePrefixResolver,
m_stringBuffer);
- if (theColonIndex == theLength)
+ if (length(theNamespace) == 0)
{
+ // the prefix was returned by getNamespaceForPrefix()...
+ assert(length(m_stringBuffer) == 0);
+
return m_attributeAllocator.create(
m_stringPool.get(theName),
m_stringPool.get(theValue),
@@ -875,10 +964,11 @@
// index
//
return m_attributeNSAllocator.create(
- m_stringPool.get(theName, theLength),
- m_stringPool.get(theName, theColonIndex),
- m_stringPool.get(XalanDOMString()),
- m_stringPool.get(theName + theColonIndex,
theLength - theColonIndex),
+ m_stringPool.get(theName),
+ m_stringPool.get(theName +
length(m_stringBuffer) + 1),
+ m_stringPool.get(theNamespace),
+ // This is the prefix...
+ m_stringPool.get(m_stringBuffer),
m_stringPool.get(theValue),
theOwnerElement,
m_nextIndexValue++);
@@ -889,7 +979,6 @@
-// Commented out for now, since we need a way to get namespace URIs. (Like
Stylesheet does).
XalanSourceTreeElement*
XalanSourceTreeDocument::createElement(
const XalanDOMChar* theTagName,
@@ -897,13 +986,17 @@
AttributesCountType
theAttributeCount,
XalanSourceTreeElement* theParentElement,
XalanNode*
thePreviousSibling,
- XalanNode*
theNextSibling)
+ XalanNode*
theNextSibling,
+ const PrefixResolver& thePrefixResolver)
{
- const unsigned int theLength = length(theTagName);
- const unsigned int theColonIndex = indexOf(theTagName,
XalanUnicode::charColon);
+ const XalanDOMString& theNamespace =
+ getNamespaceForPrefix(theTagName, thePrefixResolver,
m_stringBuffer);
- if (theColonIndex == theLength)
+ if (length(theNamespace) == 0)
{
+ // the prefix was returned by getNamespaceForPrefix()...
+ assert(length(m_stringBuffer) == 0);
+
return m_elementAllocator.create(
m_stringPool.get(theTagName),
this,
@@ -931,11 +1024,11 @@
// index
//
return m_elementNSAllocator.create(
- m_stringPool.get(theTagName, theLength),
- m_stringPool.get(theTagName + theColonIndex +
1, theColonIndex),
- // How do we get the namespace for the prefix?
- m_stringPool.get(XalanDOMString()),
- m_stringPool.get(theTagName,),
+ m_stringPool.get(theTagName),
+ m_stringPool.get(theTagName +
length(m_stringBuffer) + 1),
+ m_stringPool.get(theNamespace),
+ // This is the prefix...
+ m_stringPool.get(m_stringBuffer),
this,
theAttributeVector,
theAttributeCount,
@@ -947,7 +1040,6 @@
return 0;
}
-#endif
1.5 +36 -2
xml-xalan/c/src/XalanSourceTree/XalanSourceTreeDocument.hpp
Index: XalanSourceTreeDocument.hpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/XalanSourceTree/XalanSourceTreeDocument.hpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- XalanSourceTreeDocument.hpp 2001/01/08 18:22:37 1.4
+++ XalanSourceTreeDocument.hpp 2001/03/02 19:08:40 1.5
@@ -91,6 +91,7 @@
class AttributeList;
class Attributes;
+class PrefixResolver;
@@ -324,6 +325,15 @@
XalanSourceTreeElement*
createElementNode(
+ const XalanDOMChar* tagName,
+ const AttributeList& attrs,
+ const PrefixResolver& thePrefixResolver,
+ XalanSourceTreeElement* theParentElement = 0,
+ XalanNode*
thePreviousSibling = 0,
+ XalanNode*
theNextSibling = 0);
+
+ XalanSourceTreeElement*
+ createElementNode(
const XalanDOMChar* name,
const Attributes& attrs,
XalanSourceTreeElement* theParentElement = 0,
@@ -389,6 +399,13 @@
createAttribute(
const XalanDOMChar* theName,
const XalanDOMChar* theValue,
+ XalanSourceTreeElement* theOwnerElement,
+ const PrefixResolver& thePrefixResolver);
+
+ XalanSourceTreeAttr*
+ createAttribute(
+ const XalanDOMChar* theName,
+ const XalanDOMChar* theValue,
XalanSourceTreeElement* theOwnerElement);
XalanSourceTreeElement*
@@ -400,6 +417,16 @@
XalanNode*
thePreviousSibling,
XalanNode*
theNextSibling);
+ XalanSourceTreeElement*
+ createElement(
+ const XalanDOMChar* theTagName,
+ XalanSourceTreeAttr** theAttributeVector,
+ AttributesCountType
theAttributeCount,
+ XalanSourceTreeElement* theParentElement,
+ XalanNode*
thePreviousSibling,
+ XalanNode*
theNextSibling,
+ const PrefixResolver& thePrefixResolver);
+
void
createAttributes(
const Attributes& theAttributes,
@@ -409,9 +436,14 @@
const XalanDOMString&
getTextNodeString(
- const XalanDOMChar* chars,
- unsigned int length);
+ const XalanDOMChar* chars,
+ unsigned int length);
+ const XalanDOMString&
+ getNamespaceForPrefix(
+ const XalanDOMChar* theName,
+ const PrefixResolver& thePrefixResolver,
+ XalanDOMString& thePrefix);
// Not implemented...
XalanSourceTreeDocument(const XalanSourceTreeDocument& theSource);
@@ -457,6 +489,8 @@
UnparsedEntityURIMapType
m_unparsedEntityURIs;
StringCollectionType
m_nonPooledStrings;
+
+ XalanDOMString
m_stringBuffer;
static const XalanDOMString&
s_nameString;
};