/***********************************************************************
*
*      Projet  : DilibSgml
*      Module  : Sgml
*      Fichier : SgmlMark.c
*      Auteur  : J. Ducloy
*      Origine : J. Ducloy + V. Warth
*
*      Derniere mise a jour Janvier 94
*
*      $Id: SgmlMark.c,v 1.2 2005/06/22 13:39:17 parmentf Exp $
*
************************************************************************
*
* Copyright (c) 1994 CNRS/CRIN & INRIA Lorraine
* 
************************************************************************/

#include "SgmlNodePrivate.h"

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

/*******************************************************************************
 *                              SgmlCreateMark
 *
 * - Fonction qui crée une cellule de type SgmlNode spécifique à un element SGML
 *
 * - Les paramètres :
 *		- Gid : identificateur de la balise
 *
 * - Valeur retournée : un pointeur sur la balise
 *
 ******************************************************************************/
SgmlNode	*SgmlCreateMark(char *Gid)
{
  SgmlNode	*n;

  n = SgmlCreateNode('M');
  if(!n)return NULL;
  SgmlSubType(n)='S';
  SgmlNodeFormat(n)= SgmlNodeFormatMark;

  if(Gid)
    {
      if(!(SgmlTag(n) = malloc( strlen(Gid) + 1 )))return NULL;
      strcpy(SgmlTag(n),Gid);
    }
  return(n);

} /* end SgmlCreateMark */


/*******************************************************************************
 *                              SgmlCreateEmptyMark
 *
 * - Fonction qui crée une cellule de type SgmlNode spécifique à un
 *   élément vide
 *
 * - Les paramètres :
 *		- Tag : identificateur de la balise
 *
 * - Valeur retournée : un pointeur sur la balise
 *
 ******************************************************************************/
SgmlNode	*SgmlCreateEmptyMark(char *tag)
{
  SgmlNode	*n;

  n = SgmlCreateNode('M');
  SgmlSubType(n)='E';
  SgmlNodeFormat(n)= SgmlNodeFormatEmptyMark;
  SgmlTag(n) = (char *)malloc( strlen(tag) + 1 );
  strcpy(SgmlTag(n),tag);
  return(n);

} /* end SgmlCreateEmptyMark */

SgmlNode	*XmlCreateEmptyMark(char *tag)
{
  SgmlNode	*n;

  n = SgmlCreateNode('M');
  SgmlSubType(n)='E';
  SgmlNodeFormat(n)= XmlNodeFormatEmptyMark;
  SgmlTag(n) = (char *)malloc( strlen(tag) + 1 );
  strcpy(SgmlTag(n),tag);
  return(n);

} /* end XmlCreateEmptyMark */



/***********************************************************************
    SgmlSetEmpty

  positionne un noeud a empty
************************************************************************/
SgmlNode *SgmlSetEmpty(SgmlNode *node)
{
    if(SgmlNodeFormatToFree(node)) 
          {free(SgmlNodeFormat(node));SgmlNodeFormatToFree(node)=0;}
  SgmlNodeFormat(node)= SgmlNodeFormatEmptyMark;
  SgmlSubType(node)='E';
  return(node);
}

SgmlNode *XmlSetEmpty(SgmlNode *node)
{
    if(SgmlNodeFormatToFree(node)) 
          {free(SgmlNodeFormat(node));SgmlNodeFormatToFree(node)=0;}
  SgmlNodeFormat(node)= XmlNodeFormatEmptyMark;
  SgmlSubType(node)='E';
  return(node);
}


/***********************************************************************
*
*      predicat SgmlIsEmpty
*
***********************************************************************/
SgmlNode *SgmlIsEmpty(SgmlNode *n)
{
 if (!n)return (NULL);
 if (SgmlType(n)!='M') return (NULL);
 if (SgmlSubType(n)!='E') return (NULL);
 return (n);
}

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

         SgmlSetTag

         modifie le Tag d'un SgmlMark

***********************************************************************/
SgmlNode *SgmlSetTag(SgmlNode *Node, char *Gid)
{ 
       if (SgmlTag(Node)) free (SgmlTag(Node));
       SgmlTag(Node) = (char *)malloc( strlen(Gid) + 1 );
       strcpy(SgmlTag(Node),Gid);
       return(Node);

} /* end SgmlSetTag */
