/*
* TreeIterator.c : implementation of the TreeIterator interface as defined by
* Document Object Model (Core) Level 1
* http://www.w3.org/TR/WD-DOM/level-one-core.html
*
* Daniel.Veillard@w3.org
*
* $Id: TreeIterator.c,v 1.1 1998/06/14 07:01:12 daniel Exp $
*/
#include "config.h"
#include <stdio.h>
#include "TreeIterator.h"
/**
** All the functions "inherited" from NodeIterator are in NodeIterator.c
**/
/*
* Flat enumeration a la NodeIterator
*/
unsigned long numChildren(domTreeIteratorPtr itr) {
domNodePtr cur;
unsigned long n = 0;
if (itr == NULL) return(-1);
cur = itr->last;
if (cur == NULL) return(0);
cur = cur->childs;
while (cur != NULL) {
n++;
cur = cur->next;
}
return(n);
}
/*
* Count of previous siblings
*/
unsigned long numPreviousSibling(domTreeIteratorPtr itr) {
domNodePtr cur;
unsigned long n = 0;
if (itr == NULL) return(-1);
cur = itr->last;
if (cur == NULL) return(0);
while (cur->prev != NULL) {
n++;
cur = cur->prev;
}
return(n);
}
/*
* Count of next siblings
*/
unsigned long numNextSibling(domTreeIteratorPtr itr) {
domNodePtr cur;
unsigned long n = 0;
if (itr == NULL) return(-1);
cur = itr->last;
if (cur == NULL) return(0);
while (cur->next != NULL) {
n++;
cur = cur->next;
}
return(n);
}
/*
* Guarded move to parent
*/
domNodePtr toParent(domTreeIteratorPtr itr) {
domNodePtr cur;
if (itr == NULL) return(NULL);
cur = itr->last;
if (cur == NULL) return(NULL);
cur = cur->parent;
if (cur != NULL) itr->last = cur;
return(cur);
}
/*
* Guarded move to previous sibling
*/
domNodePtr toPreviousSibling(domTreeIteratorPtr itr) {
domNodePtr cur;
if (itr == NULL) return(NULL);
cur = itr->last;
if (cur == NULL) return(NULL);
cur = cur->prev;
if (cur != NULL) itr->last = cur;
return(cur);
}
/*
* Guarded move to next sibling
*/
domNodePtr toNextSibling(domTreeIteratorPtr itr) {
domNodePtr cur;
if (itr == NULL) return(NULL);
cur = itr->last;
if (cur == NULL) return(NULL);
cur = cur->next;
if (cur != NULL) itr->last = cur;
return(cur);
}
/*
* Guarded move to first child
*/
domNodePtr toFirstChild(domTreeIteratorPtr itr) {
domNodePtr cur;
if (itr == NULL) return(NULL);
cur = itr->last;
if (cur == NULL) return(NULL);
cur = cur->childs;
if (cur != NULL) itr->last = cur;
return(cur);
}
/*
* Guarded move to last child
*/
domNodePtr toLastChild(domTreeIteratorPtr itr) {
domNodePtr cur;
if (itr == NULL) return(NULL);
cur = itr->last;
if (cur == NULL) return(NULL);
cur = cur->lastchild;
if (cur != NULL) itr->last = cur;
return(cur);
}
/*
* Guarded move to nth child
*/
domNodePtr toNthChild(domTreeIteratorPtr itr, unsigned long n) {
domNodePtr cur;
if (itr == NULL) return(NULL);
cur = itr->last;
if (cur == NULL) return(NULL);
cur = cur->childs;
while ((cur != NULL) && (n-- > 0))
cur = cur->next;
if (cur != NULL) itr->last = cur;
return(cur);
}
Webmaster