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

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

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

SgmlNode *SgmlDataCreate(char *str)
{
  SgmlNode	*curData;
  curData = SgmlCreateNode('D');
  if (str) 
    {
	/*  SgmlDataString(curData)=(char *) malloc(strlen(str)+1); */
      SgmlDataString(curData)=(char *) malloc((strlen(str)+1)*sizeof(char));
      strcpy(SgmlDataString(curData),str);
    }
  return (curData);
}

/****************************************************************************** 
 *                              SgmlCreateData (obsolete)
 ******************************************************************************/

SgmlNode	*SgmlCreateData()
{
  SgmlNode	*CurData;

  CurData = SgmlCreateNode('D');

  return (CurData);

} /* end SgmlCreateData */


/****************************************************************************** 
 *                              SgmlPutData
 *
 * - Fonction qui donne une valeur à une cellule de type SgmlNode
 *   spécifique à des données
 *
 * - Les paramètres :
 *		- n   : cellule à compléter
 *		- str : données à copier
 * 
 * - Valeur retournée : un pointeur sur la cellule modifiée
 *
 ******************************************************************************/
SgmlNode	*SgmlPutData(SgmlNode *n, char *str)
/*	char	*str;
	SgmlNode	*n;*/
{
   
  if (SgmlDataString(n)) free (SgmlDataString(n));
  /*  SgmlDataString(n) = (char *) malloc(strlen(str)+1); */
  SgmlDataString(n) = (char *) malloc((strlen(str)+1)*sizeof(char));
  strcpy(SgmlDataString(n),str);
  return(n);

} /* end SgmlPutData */

/**************************************************************************
 *                               SgmlDataStrCat
 *
 * - Fonction qui concatene une chaine dans un noeud de type Data
 *
***************************************************************************/
char   *SgmlDataStrCat(SgmlNode *dataNode, char *str)
{
       char *StrBegin;

       if ((StrBegin=SgmlDataString(dataNode)))
	 {
           SgmlDataString(dataNode)=(char *) malloc 
	       ( (strlen(str)+strlen(StrBegin)+1)*sizeof(char));
           strcpy(SgmlDataString(dataNode), StrBegin);
           strcat(SgmlDataString(dataNode), str);
           free (StrBegin);
	 }
       else
	 {
	   SgmlPutData(dataNode, str);
	 };
       return (SgmlDataString(dataNode));

}

/**************************************************************************
 *                               SgmlDataStrncpy
 *
 * - Fonction qui realise l'equivalent d'un strncpy dans un noeud de type Data
 *
 *
 *

***************************************************************************/
char    *SgmlDataStrncpy(SgmlNode *inputNode,
			 char *str,
			 int n)
{
     if(SgmlDataString(inputNode))
        free (SgmlDataString(inputNode));
     /*SgmlDataString(inputNode)= (char *)malloc(n+1);*/
     SgmlDataString(inputNode)= (char *)malloc((n+1)*sizeof(char));
     strncpy(SgmlDataString(inputNode), str, n);
     SgmlDataString(inputNode)[n]='\0';
     return (SgmlDataString(inputNode));
}

/****************************************************************************
*                       SgmlAddData
*
*  -Fonction qui ajoute une SgmlNode de type DATA a un SgmlNode de type Mark
*
*
****************************************************************************/
SgmlNode  *SgmlAddData(SgmlNode *Mark, char *str)
{
      SgmlNode *CurData;

      CurData = SgmlCreateData();
      SgmlPutData(CurData,str);
      SgmlAddLast(Mark,CurData);

      return (Mark);
}



