/**********************************************************************
*
*  projet   : DilibPro
*  module   : Dam  (Dilib Acces Method)
*  fichier  : DamFile.c
*  Auteur   : J. DUCLOY
*  Date     : Juillet 93
*  nouvelle version : Janvier 94
*
************************************************************************
* 
*     Copyrigth (C) 1977 CRIN - CNRS & INRIA Lorraine
*
***********************************************************************/


#include <stdio.h>
#include <string.h>
#include "DamFile.h"

DamFile  *DamFileStdin;

DamFile* DamFile_Create()
{
  DamFile* file;
  file = (DamFile *)malloc(sizeof(DamFile));
  file->record=DamRecord_Create(100,100);
  file->pathSize=0;
  file->isUnixOpen=0;

  return file;
}

void DamFile_Close(file)
     DamFile *file;
{
  if(file->isUnixOpen)
    {
      fclose(file->stream);
      file->isUnixOpen=0;
    }
}

void DamFile_Free(file)
     DamFile *file;
{
  if(file)
    {
      DamFile_Close(file);
      if (file->path)free (file->path);
      if (file->record) DamRecord_Free(file->record);
      free(file);
    }
}

DamFile *DamFile_Open(file, path)
     DamFile *file;
     char *path;
{
  int len;

  file->isContOpen=0;
  file->isContSign=0;
  if(file->isUnixOpen)DamFileClose(file);
  
  if ((file->stream=fopen(path,"r")))
    {
      file->isUnixOpen=1;
      len=strlen(path);
      if (file->pathSize<len)
	{
          if (file->pathSize) free(file->path);
	  file->path = (char *)malloc((len+1)*sizeof(char));
	  file->pathSize=len;
	}
      strcpy(file->path, path);
      DamRecord_Init(file->record);
      return file;
    }
  else return NULL;
}


/**************** lecture de  DamRecord(s) *************************/

DamRecord *DamFile_NextDamRecord(file)
     DamFile *file;
{  
  DamRecord *record;

  if(file->isContOpen)file->isContSign=0;
  if((record=DamRecord_fgets(file->record,file->stream)))
    {
      return record;
    }
  else    /* pb lecture => EOF probable */
    {
      file->errCode=DamEOF;
      return (NULL);
    }
}

DamRecord *DamFile_GetRecordKeyForward(file,key)
     DamFile *file;
     char *key;
{
  DamRecord *record;
  int cond;

  while ((record=DamFile_NextDamRecord(file)))
    {
      cond=strcmp(key,DamRecordKey(record));
      if (cond==0) return record;
      if (cond<0) return NULL;
    };
  return NULL;
}

DamRecord *DamFile_GetRecordKey(file,key)
     DamFile *file;
     char *key;
{
  int cond;
  char *k;
  if((k=DamFileKey(file)))
    {
      cond = strcmp(key,k);
      if (cond==0) return file->record;
      if (cond>0) return DamFile_GetRecordKeyForward(file,key);
      rewind (file->stream);
      return DamFile_GetRecordKeyForward(file,key);
    }
  else return DamFile_GetRecordKeyForward(file,key);
}


/************************************ DamFileGetSgml **********************/

SgmlNode* DamFile_NextSgml(file)
     DamFile *file;
{
  SgmlNode *recSgml;
  DamRecord *record;

  if ((record = DamFileNextDamRecord(file)))
    {
      if((recSgml=DamRecordToSgml(record))) return recSgml->last;
    }
  return NULL;
}

SgmlNode* DamFile_NextSgmlRecord(file)
     DamFile *file;
{
  DamRecord *record;
  if ((record = DamFileNextDamRecord(file)))
    {
      return DamRecordToSgml(record);
    }
  return NULL;
}

SgmlNode* DamFile_GetSgmlKey(file, k)
     DamFile *file;
     char *k;
{
  DamRecord *record;
  SgmlNode *recSgml;
  if ((record = DamFile_GetRecordKey(file,k)))
    {
       if((recSgml=DamRecordToSgml(record))) return recSgml->last;
    }
  return NULL;
}


SgmlNode* DamFile_GetSgmlRecordKey(file, k)
     DamFile *file;
     char *k;
{
  DamRecord *record;
  if ((record = DamFile_GetRecordKey(file,k)))
    {
      return DamRecordToSgml(record);
    }
  return NULL;
}



/************************** DamFileStdin **********************************/

static int DamFileStdinFlag=0;

void DamStdinInitIfRequired()
{
  if (DamFileStdinFlag==0)
    {
      DamFileStdin=DamFileCreate();
      DamFileStdin->stream=stdin;
      DamFileStdinFlag=1;
    };
}

SgmlNode* DamStdin_NextSgml()
{
  DamStdinInitIfRequired();
  return(DamFile_NextSgml(DamFileStdin));
}


SgmlNode* DamStdin_NextSgmlRecord()
{
  DamStdinInitIfRequired();
  return(DamFile_NextSgmlRecord(DamFileStdin));
}


