
/****************************************************************************
*
*      Projet  : DilibPro
*      Module  : Sxml
*      Fichier : SxmlPrint.c
*      Auteur  : J. Ducloy
*
*      Derniere mise a jour Decembre 2000
*      $Id: SxmlPrint.c,v 1.3 2003/03/17 17:30:01 parmentf Exp $
*
************************************************************************
* 
*     Copyright (C) 2001 CNRS INIST
*
****************************************************************************/

#include "SxmlNode.h"
#include "Except.h"

void SxmlFilePrint(SxmlNode *n1, FILE *f1)
{
  if(!n1)return;
  switch(SxmlNodeType(n1))
    {
    case SXML_NODE_CONTAINER:
      SxmlContainerFilePrint(n1,f1);
      break;
    case SXML_NODE_COMMENT:
      SxmlCommentFilePrint(n1,f1);
      break;
    case SXML_NODE_DOCUMENT:
      SxmlDocumentFilePrint(n1,f1);
      break;
    case SXML_NODE_DOCUMENT_FRAGMENT:
      SxmlDocumentFragmentFilePrint(n1,f1);
      break;
    case SXML_NODE_ELEMENT:
    case SXML_NODE_XPATH_EXPRESSION:
    case SXML_NODE_XPATH_RESULT:
      SxmlElementFilePrint(n1,f1);
      break;
    case SXML_NODE_TEXT:
      SxmlTextFilePrint(n1,f1);
      break;
    case SXML_NODE_CDATA_SECTION:
      SxmlCdataFilePrint(n1,f1);
      break;
    case SXML_NODE_ATTRIBUTE:
      SxmlAttributeFilePrint(n1,f1);
      break;
    case SXML_NODE_PROCESSING_INSTRUCTION:
      SxmlProcessingInstructionFilePrint(n1,f1);
      break;
    case SXML_NODE_LIST_ATTRIBUTES:
      SxmlListAttributesFilePrint(n1,f1);
      break;
    case SXML_NODE_DOCUMENT_TYPE:
      SxmlDocumentTypeFilePrint(n1,f1);
      break;
    case SXML_NODE_RECORD:
      SxmlRecordFilePrint(n1,f1);
      break;
    default:
      break;
    }
}

/*==============================================================*/

void SxmlNodeIndent(SxmlNode *n1, Buffer *bufInd, int inc)
{
  if(!n1)return;
  switch(SxmlNodeType(n1))
    {
    case SXML_NODE_ELEMENT:
      SxmlElementIndent(n1, bufInd, inc);
      return;
    case SXML_NODE_TEXT:
      SxmlTextIndent(n1, bufInd, inc);
      return;
    case SXML_NODE_CDATA_SECTION:
      SxmlCdataIndent(n1, bufInd, inc);
      return;
    case SXML_NODE_PROCESSING_INSTRUCTION:
      SxmlProcessingInstructionIndent(n1, bufInd, inc);
      return;
    case SXML_NODE_COMMENT:
      SxmlCommentIndent(n1, bufInd, inc);
      return;
    case SXML_NODE_CONTAINER:
      SxmlContainerIndent(n1, bufInd, inc);
      return;
    case SXML_NODE_DOCUMENT_TYPE:
      SxmlDocumentTypeIndent(n1, bufInd, inc);
      return;
    }
}

/*==============================================================*/

SxmlNode *SxmlPrintDocToFile(SxmlNode *x1, char *s1)
{
  FILE *f1;
  if ((f1=fopen(s1,"w")))
    {
      SxmlFilePrint( x1, f1);
      fprintf(f1,"\n");
      fclose(f1);
    }
  else
    {
      ExceptSetError("SxmlPrintDocToFile","NF","file ", s1 , "not fit",2);
      exit(1);
    }
  return x1;
}


/*==============================================================*/
Buffer *SxmlToStringInternalBuffer=NULL;

char *SxmlToStringRecursive(Buffer *b1, SxmlNode *x1)
{
  if(!x1)return "";
  switch(SxmlNodeType(x1))
    {
    case XML_NODE_COMMENT:
      SxmlCommentToString(b1,x1);
      break;
    case XML_NODE_DOCUMENT:
      SxmlToStringRecursive(b1,SxmlFirstChild(x1));
      break;
    case XML_NODE_DOCUMENT_FRAGMENT:
      {
	SxmlNode *ed1;
	SxmlReset(x1);
	while((ed1=SxmlNextNode(x1)))SxmlToStringRecursive(b1,ed1);
      }
      break;
    case XML_NODE_ELEMENT:
      SxmlElementToString(b1,x1);
      break;
    case XML_NODE_TEXT:
      BufferStrcat(b1,SxmlNodeValue(x1));
      break;
    case XML_NODE_ATTRIBUTE:
      SxmlAttributeToString(b1,x1);
      break;
    case XML_NODE_PROCESSING_INSTRUCTION:

      break;
    case XML_NODE_LIST_ATTRIBUTES:
      SxmlListAttributesToString(b1,x1);
      break;
    case XML_NODE_DOCUMENT_TYPE:

      break;
    case XML_NODE_RECORD:
      SxmlRecordToString(b1,x1);
      break;
    default:
      break;
    }
  return BufferString(b1);
}

char *SxmlToString(SxmlNode *x1)
{
  if (!(SxmlToStringInternalBuffer))
    SxmlToStringInternalBuffer=BufferCreate(50,50);
  BufferReset(SxmlToStringInternalBuffer);
  return SxmlToStringRecursive(SxmlToStringInternalBuffer,x1);
}
/*==============================================================*/


Buffer *SxmlDumpBufferIndent=NULL;

void SxmlDump(SxmlNode *x1)
{
  if(!SxmlDumpBufferIndent)SxmlDumpBufferIndent=BufferCreate(10,10);
  if (!x1)
    {
      SxmlInternalDump();
      return;
    }
  if (SxmlNodeType(x1)<10)printf(" ");
  printf("%d:%d %s",
	 SxmlNodeType(x1), SxmlNodeSubType(x1),
	 BufferString(SxmlDumpBufferIndent));
  if (SxmlNodeSubType(x1)<10)printf(" ");
  switch(SxmlNodeType(x1))
    {
    case XML_NODE_COMMENT:
      SxmlCommentFilePrint(x1,stdout);
      break;
    case XML_NODE_TEXT:
      SxmlTextFilePrint(x1,stdout);
      break;
    case XML_NODE_ELEMENT:
    case XML_NODE_BEGIN_ELEMENT:
    case XML_NODE_END_ELEMENT:
    case XML_NODE_RECORD:
    case XML_NODE_DOCUMENT:
    case XML_NODE_XPATH_EXPRESSION:
    case XML_NODE_XPATH_RESULT:
    case XML_NODE_PROCESSOR:
      SxmlElementDump(x1);
      break;
    case XML_NODE_CONTAINER:
      SxmlContainerDump(x1);
      break;
    case XML_NODE_PROCESSING_INSTRUCTION:
      SxmlProcessingInstructionFilePrint(x1,stdout);
      break;
    default:
      break;
    }
  putchar('\n');
}

/*
                                              SxmlSave

 */
void SxmlFileSave(SxmlNode *n1, FILE *f1)
{
  if(!n1)return;
  switch(SxmlNodeType(n1))
    {
    case XML_NODE_CONTAINER:
      SxmlContainerFileSave(n1, f1);
      break;
    case XML_NODE_ELEMENT:
      SxmlElementFileSave(n1, f1);
      break;
    default:
      SxmlFilePrint(n1, f1);
      break;
    }
}

