
/****************************************************************************
*
*      Module  : Sxml
*      Fichier : SxmlDtd.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 *SxmlDocumentTypeCreate(str)
     char *str;
{
  SxmlNode *dtd1;
  char *strD;
  if(!(strD=strdup(str)))
    {
      ExceptSetError("SxmlNode","MA", "memory allocation failed","","",2);
    }
  dtd1=SxmlNodeCreate(XML_NODE_DOCUMENT_TYPE);
  SxmlSetNodeName(dtd1,strD);
  SxmlSetNodeNameToFree(dtd1);
  return dtd1;
}

SxmlNode *SxmlDocumentTypeAppendChild(dtd1,e1)
     SxmlNode *dtd1;
     SxmlNode *e1;
{
  SxmlAppendChild(dtd1,e1);
  return e1;
}

SxmlNode *SxmlDocumentTypeSetSystem(dtd1,str)
     SxmlNode *dtd1;
     char *str;
{
  SxmlSetAttribute(dtd1,"SYSTEM",str);
  SxmlSetNodeSubType(dtd1,XML_DOCTYPE_SYSTEM);
  return dtd1;
}

SxmlNode *SxmlDocumentTypeSetPublic(dtd1,strPub, strSys)
     SxmlNode *dtd1;
     char *strPub;
     char *strSys;
{
  SxmlSetAttribute(dtd1,"PUBLIC",strPub);
  if(strSys)SxmlSetAttribute(dtd1,"URI",strSys);
  SxmlSetNodeSubType(dtd1,XML_DOCTYPE_PUBLIC);
  return dtd1;
}

SxmlNode  *SxmlDocumentTypeSetHtml(SxmlNode *dtd1)
{
  SxmlSetNodeSubType(dtd1,XML_DOCTYPE_HTML);
  return dtd1;
}

void SxmlDocumentTypeFilePrint(dtd1,f1)
     SxmlNode *dtd1;
     FILE *f1;
{
  SxmlNode *e1;
  fprintf(f1,"<!DOCTYPE %s",SxmlNodeName(dtd1));
  if (SxmlNodeSubType(dtd1)==XML_DOCTYPE_SYSTEM)
    fprintf(f1," SYSTEM \"%s\"",SxmlGetAttribute(dtd1,"SYSTEM"));
  else if  (SxmlNodeSubType(dtd1)==XML_DOCTYPE_PUBLIC)
    {
      char *att;
      fprintf(f1," PUBLIC");
      if ((att=SxmlGetAttribute(dtd1,"PUBLIC")))
	fprintf(f1," \"%s\"",att);
      if ((att=SxmlGetAttribute(dtd1,"SYSTEM")))
	fprintf(f1," \"%s\"",att);
    }

  if (SxmlFirstChild(dtd1))
    {
      fprintf(f1," [");
      SxmlReset(dtd1);
      while((e1=SxmlNextNode(dtd1)))
	{
	  switch(SxmlNodeType(e1))
	    {
	    case XML_NODE_COMMENT:
	      fprintf(f1,"\n");
	      SxmlCommentFilePrint(e1,f1);
	      break;
	    case XML_NODE_ELEMENT:
	      if (SxmlNodeHasName(e1,"elementType"))
		{
		  fprintf(f1, "\n<!ELEMENT ");
		  fprintf(f1, "%s", SxmlGetAttribute(e1,"name"));
		  fprintf(f1, ">");
		  break;
		}
	    default:
	      break;
	    }
	}
      fprintf(f1,"\n]");
    }
  fprintf(f1,">");
}

void SxmlDocumentTypeIndent(SxmlNode *dtd1, Buffer *bufInd, int inc)
{
  printf("%s<!DOCTYPE %s", BufferString(bufInd), SxmlNodeName(dtd1));
  if (SxmlNodeSubType(dtd1)==XML_DOCTYPE_SYSTEM)
    printf(" SYSTEM \"%s\"",SxmlGetAttribute(dtd1,"SYSTEM"));
  printf(">\n");
}


SxmlNode *SxmlDocumentEntityDeclarationCreate(char *name)
{
  SxmlNode *entDec;
  char *strD;
  if(!(strD=strdup(name)))
    {
      ExceptSetError("SxmlDtd","MA", "memory allocation failed","","",2);
    }
  entDec=SxmlNodeCreate(SXML_NODE_ENTITY_DECLARATION);
  SxmlSetNodeName(entDec,strD);
  SxmlSetNodeNameToFree(entDec);
  return entDec;
}
