/*   -*- coding: utf-8 -*-  */

/****************************************************************************
*
*      Module  : Sxml
*      Fichier : SxmlElement.c
*      Auteur  : J. Ducloy
*
*      Derniere mise a jour Decembre 2000
*
************************************************************************
* 
*     Copyrigth (C) 2001 CNRS INIST
*
****************************************************************************/
#include "Except.h"
#include "Buffer.h"
#include "SxmlNode.h"

SxmlNode *SxmlElementCreate(char *str)
{
  SxmlNode *e1;
  char *strD;
  if (!(strD=strdup(str)))
    {
      ExceptSetError("SxmlNode","MA", "memory allocation failed","","",2);
    }
  e1= SxmlNodeCreate(SXML_NODE_ELEMENT);
  SxmlSetNodeName(e1,strD);
  SxmlSetNodeNameToFree(e1);
  e1->subType=XML_ELEMENT_STANDARD;
  return e1;
}

void SxmlElementDump( SxmlNode *x1)
{ 
  SxmlNode *lAtt;

  if (SxmlNodeType(x1)==XML_NODE_END_ELEMENT)
    {
       printf("</%s>",SxmlNodeName(x1));
      return;
    }
  printf("<%s",SxmlNodeName(x1));
  if((lAtt=SxmlGetListAttributes(x1)))
    SxmlListAttributesFilePrint(lAtt,stdout);
  if ((SxmlIsElement(x1))&&(SxmlElementIsEmpty(x1)))
    {
      printf("/>");
      return;
    }
  else printf(">");
  if (SxmlFirstChild(x1))
    {
      SxmlNode *x2;
      SxmlReset(x1);
      BufferStrcat(SxmlDumpBufferIndent," ");
      while((x2=SxmlNextNode(x1)))
	{putchar('\n');SxmlDump(x2);}
      BufferTailCut(SxmlDumpBufferIndent,1);
      printf("      %s</%s>",BufferString(SxmlDumpBufferIndent),SxmlNodeName(x1));
    }
  else printf(" no child ");
  
}

void SxmlElementIndent(SxmlNode *n1, Buffer *bufInd, int inc)
{
  SxmlNode *lAtt;
  SxmlNode *n2;
  int nSpace;
  if (SxmlNodeType(n1)==SXML_NODE_DOCUMENT_TYPE)
    {
       SxmlDocumentTypeIndent(n1, bufInd, inc);
       return;
    }
  printf("%s<%s", BufferString(bufInd), SxmlNodeName(n1));
  if((lAtt=SxmlGetListAttributes(n1)))
    SxmlListAttributesFilePrint(lAtt,stdout);
  if (SxmlElementIsEmpty(n1))
    {
      printf("/>\n");
      return;
    }
  printf(">");
  if  (SxmlIsLeaf(n1))
    {
      SxmlPrint(SxmlFirstChild(n1));
      printf("</%s>\n",  SxmlNodeName(n1));
      return;
    }
  putchar('\n');
  nSpace=inc;
  while (nSpace--)BufferStrcat(bufInd," ");
  SxmlReset(n1);
  while ((n2=SxmlNextNode(n1))) SxmlNodeIndent(n2, bufInd, inc);
  BufferTailCut(bufInd,2);
  printf("%s</%s>\n",  BufferString(bufInd), SxmlNodeName(n1));
  return;

}

void SxmlElementFilePrint(e1,f1)
     SxmlNode *e1;
     FILE *f1;
{
  SxmlNode *c1;
  SxmlNode *lAtt;
  fprintf(f1,"<%s",  SxmlNodeName(e1));
  if((lAtt=SxmlGetListAttributes(e1)))
    SxmlListAttributesFilePrint(lAtt,f1);
  if (SxmlElementIsEmpty(e1))
    {
      fprintf(f1,"/>");
      return;
    }
  else fprintf(f1,">");
  SxmlReset(e1);
  while((c1=SxmlNextNode(e1)))SxmlFilePrint(c1,f1);
  fprintf(f1,"</%s>",  SxmlNodeName(e1));
}

void SxmlElementFileSave(SxmlNode *e1, FILE *f1)
{
  SxmlNode *c1;
  SxmlNode *lAtt;
  fprintf(f1,"<%s",  SxmlNodeName(e1));
  if((lAtt=SxmlGetListAttributes(e1)))
    SxmlListAttributesFilePrint(lAtt,f1);
  if (SxmlElementIsEmpty(e1))
    {
      fprintf(f1,"/>");
      return;
    }
  else fprintf(f1,">");
  SxmlReset(e1);
  while((c1=SxmlNextNode(e1)))SxmlFileSave(c1,f1);
  fprintf(f1,"</%s>",  SxmlNodeName(e1));
}

char *SxmlElementToString(b1,e1)
     Buffer *b1;
     SxmlNode *e1;
{
  SxmlNode *lAtt;
  BufferStrcat(b1,"<");
  BufferStrcat(b1,SxmlNodeName(e1));
  if((lAtt=SxmlGetListAttributes(e1)))
    SxmlListAttributesToString(b1,lAtt);
  if (SxmlElementIsEmpty(e1))
    {
      BufferStrcat(b1,"/>");
    }
  else
    {
      SxmlNode *x2;
      BufferStrcat(b1,">");
      SxmlReset(e1);
      while((x2=SxmlNextNode(e1)))SxmlToStringRecursive(b1,x2);
      BufferStrcat(b1,"</");
      BufferStrcat(b1,SxmlNodeName(e1));
      BufferStrcat(b1,">");
    }
  return BufferString(b1);
}


