/****************************************************************************
*
*      Projet  : DilibPro
*      Module  : Sxml
*      Fichier : SxmlClone.c
*      Auteur  : J. Ducloy
*
*      Derniere mise a jour Decembre 2001
*      $Id: SxmlClone.c,v 1.2 2003/01/17 09:35:32 parmentf Exp $
*
************************************************************************
* 
*     Copyrigth (C) 2001 CNRS INIST
*
****************************************************************************/
#include "SxmlNode.h"
#include "SgmlNode.h"

SxmlNode *SxmlClone(x1)
     SxmlNode *x1;
{
  SxmlNode *x2;
  SxmlNode *x3;
  SxmlNode *la1;
  SxmlNode *la2;
  SxmlNode *n;
  char *s1;

  if (!x1)return NULL;
  if(SxmlNodeType(x1)==XML_NODE_DILIB)return (SxmlNode *)SgmlCopy(x1);
  x2=SxmlNodeCreate(SxmlNodeType(x1));
  SxmlSetNodeSubType(x2,SxmlNodeSubType(x1));
  SxmlSetNodeCustomType(x2,SxmlNodeCustomType(x1));
  if((s1=SxmlNodeValue(x1)))
    {
      if( SxmlNodeValueToFree(x1))
	{
	  SxmlSetNodeValueToFree(x2);
	  if (SxmlNodeType(x1)==XML_NODE_CONTAINER)
	    {
	      SxmlNode *xc1;
	      Buffer *b1;
	      switch(SxmlNodeSubType(x1))
		{
		case XML_CONTAINER_INTEGER:
		  SxmlSetNodeValue(x2,s1);
		  break;
		case XML_CONTAINER_STRING:
		  SxmlSetNodeValue(x2,strdup(s1));
		  break;
		case XML_CONTAINER_XML_NODE:
		  xc1=SxmlClone((SxmlNode*)s1);
		  SxmlSetNodeValue(x2,(char *)xc1);
		  break;
		case XML_CONTAINER_BUFFER:
		  b1=BufferClone((Buffer *)s1);
		  SxmlSetNodeValue(x2,(char *)b1);
		  break;
		}
	    }
	  else
	    {
	      SxmlSetNodeValue(x2,strdup(s1));
	    }
	}
      else
	{
	  SxmlSetNodeValue(x2,s1);
	}
    }
  if((s1=SxmlNodeName(x1)))
    {
      if( SxmlNodeNameToFree(x1))
	{
	  SxmlSetNodeNameToFree(x2);
	  SxmlSetNodeName(x2,strdup(s1));
	}
      else
	{
	  SxmlSetNodeName(x2,s1);
	}
    }
  n = x1->nextNode;
  SxmlReset(x1);
  while((x3=SxmlNextNode(x1)))SxmlAppendChild(x2,SxmlClone(x3));
  if((la1=SxmlGetListAttributes(x1)))
    {
      la2=SxmlListAttributesCreate();
      SxmlSetListAttributes(x2,la2);
      SxmlReset(la1);
        while((x3=SxmlNextNode(la1)))SxmlAppendChild(la2,SxmlClone(x3));
    }
  x1->nextNode = n;
  return x2;
}
