You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by bl...@apache.org on 2003/05/09 14:07:59 UTC
cvs commit: xml-security/c/src/utils XSECXPathNodeList.cpp XSECXPathNodeList.hpp
blautenb 2003/05/09 05:07:59
Modified: c/Projects/VC6.0/xsec/xsec_lib xsec_lib.dsp
c/src/transformers TXFMXPathFilter.cpp
c/src/utils XSECXPathNodeList.cpp XSECXPathNodeList.hpp
Log:
Re-implemented node-lists as an ordered list using binary search
Revision Changes Path
1.12 +8 -8 xml-security/c/Projects/VC6.0/xsec/xsec_lib/xsec_lib.dsp
Index: xsec_lib.dsp
===================================================================
RCS file: /home/cvs/xml-security/c/Projects/VC6.0/xsec/xsec_lib/xsec_lib.dsp,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- xsec_lib.dsp 8 May 2003 12:10:58 -0000 1.11
+++ xsec_lib.dsp 9 May 2003 12:07:59 -0000 1.12
@@ -821,6 +821,14 @@
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\src\transformers\TXFMXPathFilter.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\transformers\TXFMXPathFilter.hpp
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\src\transformers\TXFMXSL.cpp
# End Source File
# Begin Source File
@@ -836,13 +844,5 @@
SOURCE=..\..\..\..\src\framework\version.rc
# End Source File
# End Group
-# Begin Source File
-
-SOURCE=..\..\..\..\src\transformers\TXFMXPathFilter.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\src\transformers\TXFMXPathFilter.hpp
-# End Source File
# End Target
# End Project
1.3 +42 -15 xml-security/c/src/transformers/TXFMXPathFilter.cpp
Index: TXFMXPathFilter.cpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/transformers/TXFMXPathFilter.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TXFMXPathFilter.cpp 8 May 2003 12:28:55 -0000 1.2
+++ TXFMXPathFilter.cpp 9 May 2003 12:07:59 -0000 1.3
@@ -437,19 +437,22 @@
return true;
}
-#if 0
+#if 1
void TXFMXPathFilter::walkDocument(DOMNode * n) {
+ // Non-recursive version
DOMNode * current = n;
DOMNode * next;
+ DOMNode * attParent;
bool done = false;
bool treeUp = false;
DOMNamedNodeMap * atts = n->getAttributes();
int attsSize = -1;
int currentAtt = -1;
+ lstsVectorType::iterator lstsIter;
- while (done == false) {
+ while (done == false && current != NULL) {
if (treeUp == true) {
@@ -462,6 +465,15 @@
else {
+ // Remove this node from the ancestor lists
+ for (lstsIter = m_lsts.begin(); lstsIter < m_lsts.end(); ++lstsIter) {
+
+ if ((*lstsIter)->ancestorInScope == current) {
+ (*lstsIter)->ancestorInScope = NULL;
+ }
+ }
+
+
// Check for another sibling
next = current->getNextSibling();
@@ -485,7 +497,6 @@
else {
// Check if the current node is in the result set. The walk the children
- lstsVectorType::iterator lstsIter;
// First check if this node is in any lists, and if so,
// set the appropriate ancestor nodes (if necessary)
@@ -505,9 +516,9 @@
// Now that the ancestor setup is done, check to see if this node is
// in scope.
- if (checkNodeInScope(n) && checkNodeInInput(n)) {
+ if (checkNodeInScope(current) && checkNodeInInput(current)) {
- m_xpathFilterMap.addNode(n);
+ m_xpathFilterMap.addNode(current);
}
@@ -522,8 +533,14 @@
// Attribute list complete
atts = NULL;
- current = current->getParentNode();
- treeUp = true;
+ current = attParent;
+ next = current->getFirstChild();
+ if (next == NULL)
+ treeUp = true;
+ else {
+ current = next;
+ treeUp = false;
+ }
}
@@ -537,23 +554,33 @@
else {
// Working on an element or other non-attribute node
- atts = n->getAttributes();
+ atts = current->getAttributes();
+
if (atts != NULL && ((attsSize = atts->getLength()) > 0)) {
currentAtt = 0;
+ attParent = current;
current = atts->item(0);
+ treeUp = false;
}
else {
- next = current->getNextSibling();
- if (next == NULL) {
- current = current->getParentNode();
+ atts = NULL;
+
+ next = current->getFirstChild();
+
+ if (next != NULL) {
+ current = next;
+ treeUp = false;
+ }
+
+ else {
+
treeUp = true;
+
}
- else
- current = next;
}
} /* ! atts == NULL */
@@ -561,7 +588,7 @@
} /* while */
}
#endif
-#if 1
+#if 0
void TXFMXPathFilter::walkDocument(DOMNode * n) {
1.4 +130 -98 xml-security/c/src/utils/XSECXPathNodeList.cpp
Index: XSECXPathNodeList.cpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/utils/XSECXPathNodeList.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XSECXPathNodeList.cpp 1 Mar 2003 06:27:30 -0000 1.3
+++ XSECXPathNodeList.cpp 9 May 2003 12:07:59 -0000 1.4
@@ -84,9 +84,12 @@
// Constructors and Destructors.
// --------------------------------------------------------------------------------
-XSECXPathNodeList::XSECXPathNodeList() {
+XSECXPathNodeList::XSECXPathNodeList(unsigned int initialSize) {
- mp_first = mp_last = NULL;
+ mp_elts = new const DOMNode *[initialSize];
+ m_size = initialSize;
+ m_current = 0;
+ m_num = 0;
}
@@ -94,20 +97,13 @@
// Copy Constructor
- // For now simply delete the old list and set with the new
- // Large overhead as we call other functions, but simplest way to
- // implement for now
-
- mp_first = mp_last = NULL;
+ mp_elts = new const DOMNode *[other.m_size];
+ m_size = other.m_size;
+ m_num = other.m_num;
- XSECXPathNodeListElt *cpyTmp;
+ for (unsigned int i = 0; i < m_num; ++i) {
- cpyTmp = other.mp_first;
-
- while (cpyTmp != NULL) {
-
- addNode(cpyTmp->element);
- cpyTmp = cpyTmp->next;
+ mp_elts[i] = other.mp_elts[i];
}
@@ -117,7 +113,7 @@
// Delete all the elements in the node list
- clear();
+ delete[] mp_elts;
}
@@ -127,16 +123,15 @@
// Large overhead as we call other functions, but simplest way to
// implement for now
- clear();
+ delete[] mp_elts;
- XSECXPathNodeListElt *cpyTmp;
+ mp_elts = new const DOMNode *[toCopy.m_size];
+ m_size = toCopy.m_size;
+ m_num = toCopy.m_num;
- cpyTmp = toCopy.mp_first;
+ for (unsigned int i = 0; i < m_num; ++i) {
- while (cpyTmp != NULL) {
-
- addNode(cpyTmp->element);
- cpyTmp = cpyTmp->next;
+ mp_elts[i] = toCopy.mp_elts[i];
}
@@ -148,22 +143,42 @@
// Utility Functions.
// --------------------------------------------------------------------------------
-XSECXPathNodeList::XSECXPathNodeListElt * XSECXPathNodeList::findNode(const DOMNode *n) {
+unsigned int XSECXPathNodeList::findNodeIndex(const DOMNode *n) {
- XSECXPathNodeListElt * tmp;
+ // Check default values
+ if (m_num == 0 || mp_elts[0] >= n)
+ return 0;
- tmp = mp_first;
+ // Binary search through the list to find where this node should be
- while (tmp != NULL) {
+ unsigned int l = 0; // Low
+ unsigned int h = m_num; // High
- if (tmp->element == n)
- return tmp;
+ unsigned int i;
- tmp = tmp->next;
+ while (true) {
- }
+ i = l + ((h - l) / 2);
- return NULL;
+ if (l == i)
+ return i + 1; // Insert point is the next element
+
+ if (mp_elts[i] == n) {
+ return i; // Found and in list
+ }
+
+ if (n > mp_elts[i]) {
+
+ // In top half of search space
+ l = i;
+
+ }
+
+ else
+ // In bottom half of search space
+ h = i;
+
+ }
}
@@ -174,90 +189,77 @@
void XSECXPathNodeList::addNode(const DOMNode *n) {
- XSECXPathNodeListElt *tmp;
-
- if (findNode(n) != NULL)
- return; // Allready exists
+ if (m_num == 0) {
+ mp_elts[0] = n;
+ m_num = 1;
+ return;
+ }
- XSECnew(tmp, XSECXPathNodeListElt);
- tmp->element = n;
+ unsigned int i = findNodeIndex(n);
- if (mp_first == NULL) {
+ if (i != m_num && mp_elts[i] == n)
+ return;
+#if 0
+ if (m_num == m_size) {
- tmp->next = NULL;
- tmp->last = NULL;
+ // need to re-create the list with a bigger aray
+ m_size *= 10;
+
+ const DOMNode ** newElts = new const DOMNode*[m_size];
+ for (unsigned j = 0; j < m_num; ++j) {
+ newElts[j] = mp_elts[j];
+ }
+ delete mp_elts;
+ mp_elts = newElts;
+
+ }
- mp_first = tmp;
- mp_last = tmp;
+ for (unsigned int j = m_num; j > i; --j) {
+ mp_elts[j] = mp_elts[j - 1];
+
}
+#endif
+ if (m_num == m_size) {
- else if (mp_last == NULL) {
+ // Need to create the list with a bigger array
+ m_size *= 10;
- delete tmp;
+ const DOMNode ** newElts = new const DOMNode*[m_size];
+ memcpy(newElts, mp_elts, sizeof(DOMNode *) * m_num);
- throw XSECException(XSECException::InternalError,
- "XSECXPathNodeList has an element that is incorrectly linked");
+ delete mp_elts;
+ mp_elts = newElts;
}
- else {
+ memmove(&(mp_elts[i+1]), &(mp_elts[i]), (m_num - i) * sizeof(DOMNode *));
- mp_last->next = tmp;
- tmp->last = mp_last;
- tmp->next = NULL;
- mp_last = tmp;
- }
+ mp_elts[i] = n;
+ ++m_num;
}
void XSECXPathNodeList::removeNode(const DOMNode *n) {
- XSECXPathNodeListElt * tmp;
+ unsigned int i = findNodeIndex(n);
- tmp = findNode(n);
-
- if (tmp == NULL)
+ if (i == m_num || mp_elts[i] != n)
+ // not found
return;
- if (tmp->last != NULL) {
+ for (unsigned int j = i; j < m_num; ++j)
+ mp_elts[j] = mp_elts[j+1];
- tmp->last->next = tmp->next;
+ m_num--;
- }
-
- if (tmp->next != NULL) {
-
- tmp->next->last = tmp->last;
-
- }
-
- if (mp_first == tmp)
- mp_first = tmp->next;
- if (mp_last == tmp)
- mp_last = tmp->last;
-
- delete tmp;
}
void XSECXPathNodeList::clear() {
- XSECXPathNodeListElt * tmp;
-
- tmp = mp_first;
-
- while (tmp != NULL) {
-
- mp_first = tmp->next;
- delete tmp;
-
- tmp = mp_first;
-
- }
-
- mp_last = NULL;
+ m_num = 0;
}
@@ -268,33 +270,63 @@
bool XSECXPathNodeList::hasNode(const DOMNode *n) {
- return (findNode(n) != NULL);
+ unsigned int i = findNodeIndex(n);
+
+ return (i != m_num && mp_elts[i] == n);
}
const DOMNode *XSECXPathNodeList::getFirstNode(void) {
- if (mp_first == NULL)
- return NULL;
-
- mp_search = mp_first->next;
- return mp_first->element;
+ m_current = 0;
+ return getNextNode();
}
const DOMNode *XSECXPathNodeList::getNextNode(void) {
- if (mp_search == NULL)
+ if (m_current == m_num)
return NULL;
- XSECXPathNodeListElt * tmp;
+ return mp_elts[m_current++];
- tmp = mp_search;
- mp_search = mp_search->next;
+}
- return tmp->element;
+// --------------------------------------------------------------------------------
+// Intersect with another list
+// --------------------------------------------------------------------------------
-}
+void XSECXPathNodeList::intersect(const XSECXPathNodeList &toIntersect) {
+
+ const DOMNode ** newList = new const DOMNode *[m_size];
+
+ unsigned int i = 0;
+ unsigned int j = 0;
+ unsigned int k = 0;
+
+ while (true) {
+
+ if (mp_elts[i] == toIntersect.mp_elts[j]) {
+ newList[k++] = mp_elts[i++];
+ j++;
+ }
+
+ else if (mp_elts[i] < toIntersect.mp_elts[j]) {
+ ++i;
+ }
+ else
+ ++j;
+
+ if (i == m_num || j == toIntersect.m_num)
+ break;
+
+ }
+
+ m_num = k;
+ delete[] mp_elts;
+ mp_elts = newList;
+
+}
1.4 +25 -24 xml-security/c/src/utils/XSECXPathNodeList.hpp
Index: XSECXPathNodeList.hpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/utils/XSECXPathNodeList.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XSECXPathNodeList.hpp 22 Feb 2003 08:47:26 -0000 1.3
+++ XSECXPathNodeList.hpp 9 May 2003 12:07:59 -0000 1.4
@@ -79,6 +79,8 @@
XSEC_DECLARE_XERCES_CLASS(DOMNode);
+#define _XSEC_NODELIST_DEFAULT_SIZE 100
+
/**
* @ingroup internal
*/
@@ -98,30 +100,12 @@
class DSIG_EXPORT XSECXPathNodeList {
-
-private:
-
- /**
- * \brief Element holder.
- *
- * Currently the list is implemented as a simple doubly linked list.
- */
-
- struct XSECXPathNodeListElt {
-
- const DOMNode * element; // Element referred to
-
- XSECXPathNodeListElt * next,
- * last; // For the list
-
- };
-
public:
/** @name Constructors, Destructors and operators */
//@{
- XSECXPathNodeList();
+ XSECXPathNodeList(unsigned int initialSize = _XSEC_NODELIST_DEFAULT_SIZE);
/**
* \brief Copy Constructor
@@ -219,15 +203,32 @@
//@}
+ /** @name Manipulating Nodesets */
+ //@{
+
+ /**
+ *\brief Intersect with nodeset
+ *
+ * Delete any nodes in my list that are not in the intersect list
+ *
+ * @param toIntersect The list to intersect with.
+ */
+
+ void intersect(const XSECXPathNodeList &toIntersect);
+
+ //@}
+
private:
// Internal functions
- XSECXPathNodeListElt * findNode(const DOMNode * n);
+ unsigned int findNodeIndex(const DOMNode * n);
+
+ const DOMNode ** mp_elts; // The current list of elements
- XSECXPathNodeListElt * mp_first; // First node in list
- XSECXPathNodeListElt * mp_last; // Last node in list
- XSECXPathNodeListElt * mp_search; // Where we are in the return
+ unsigned int m_size; // How big is the current array
+ unsigned int m_num; // Number of elements in the array
+ unsigned int m_current; // current point in list for getNextNode
};