File:  [Public] / DOM / TreeIterator.c
Revision 1.1: download - view: text, annotated - select for diffs
Sun Jun 14 07:01:12 1998 UTC (26 years ago) by daniel
Branches: MAIN
CVS tags: HEAD
Fixed wrong implementation of NodeIterator, added TreeIterator, Daniel.

/*
 * 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