/**********************************************************************
*
*  projet   : DilibPro
*  module   : Sgml
*  fichier  : SgmlTreeIter.c
*  Auteur   : Jacques DUCLOY
*  Date     : Octobre 93
******************************************************************************
*
* Copyright (c) 1994 CNRS/CRIN & INRIA Lorraine
* 
***********************************************************************/
#include <string.h>
#include "SgmlNode.h"

char *malloc();

/************************************************************************/

SgmlTreeIterator* SgmlTreeIteratorCreate()
{
  SgmlTreeIterator *iter;
  iter = (SgmlTreeIterator *)malloc(sizeof(SgmlTreeIterator));
  iter->root=NULL;
  iter->next=NULL;
  return iter;
}

SgmlTreeIterator* SgmlTreeIteratorInit(iter,r)
     SgmlTreeIterator *iter;
     SgmlNode *r;
{
  iter->root=r;
  iter->next=r;
  return iter;
}



SgmlNode *SgmlTreeNextNode(iter)
     SgmlTreeIterator *iter;
{
  SgmlNode *n;
  SgmlNode *n1;
  if ((n=iter->next))
    {
      if((iter->next=SgmlFirst(n)))return n;
      if((iter->next=SgmlNext(n)))return n;
      if(n==iter->root)
	{
	  iter->next=NULL;
	  return n;
	};
      n1=n;
      while ((n1=SgmlFather(n1))&&(n1!=iter->root))
	{
	  if((iter->next=SgmlNext(n1)))return n;
	}
      iter->next=NULL;
      return n;
    }
  else return NULL;
}

char *SgmlTreeNextData(it)
     SgmlTreeIterator *it;
{
  SgmlNode *n;
  while ((n=SgmlTreeNextNode(it)))
    {
      if (SgmlIsData(n)) return SgmlDataString(n);
    }
  return NULL;
}
/****************************************************************************/

