/*   -*- coding: utf-8 -*-  */
/***********************************************************************

*  module   : Hfd
*  fichier  : HfdStoreFile.c
*  Auteur   : Jacques DUCLOY
*  Date     : Fevrier 2012
*
************************************************************************
* 
*     CC-by-sa Université de Lorraine
*
***********************************************************************/
/*  futur .h */
#include <sys/types.h>
#include <sys/stat.h>
#include "Buffer.h"
#include "RegExp.h"

struct stat HfdFilesBufStat;
Buffer *HfdCreateDirBuffer=NULL;

/* fin .h */

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

/*

static  struct stat *bufStat;

*/

int HfdCreateDirRecursive(dir)
     char *dir;
{
  char *posSlash;
  if ((posSlash=strchr(dir,'/')))
    {
      posSlash[0]='\0';
      if ((stat(BufferString(HfdCreateDirBuffer), &HfdFilesBufStat)!=0)) 
	mkdir(BufferString(HfdCreateDirBuffer),S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH );
      posSlash[0]='/';
      HfdCreateDirRecursive(posSlash+1);
    }
  else
    {
      if ((stat(BufferString(HfdCreateDirBuffer), &HfdFilesBufStat)==0)) return 1;
      mkdir(BufferString(HfdCreateDirBuffer),S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH );
    }

  return 0;
}

int HfdCreateDir (char *dir)
{
  char *posSlah;
  
  if(!HfdCreateDirBuffer) HfdCreateDirBuffer=BufferFromString(dir);
  else BufferStrcpy(HfdCreateDirBuffer,dir);
  HfdCreateDirRecursive(BufferString(HfdCreateDirBuffer));

  return 0;
}

FILE *HfdFileOpenWrite(file)
     char *file;
{
  FILE *fileOutput;
  char *posSlash;
  if ((stat(file, &HfdFilesBufStat)!=0))
    {
      if((posSlash=strrchr(file,'/')))
	{
	  Buffer *b;
	  b=BufferFromString(file);
	  posSlash=strrchr(BufferString(b),'/');
	  posSlash[0]='\0';
	  HfdCreateDir (BufferString(b));
	  BufferFree (b);
	}
      fileOutput=fopen(file, "w");
    }
  else
    {
      fileOutput=fopen(file, "w");
    }
  return fileOutput;
}

FILE *HfdFileOpenAppend(file)
     char *file;
{
  FILE *fileOutput;
  char *posSlash;
  if ((stat(file, &HfdFilesBufStat)!=0))
    {
      if((posSlash=strrchr(file,'/')))
	{
	  Buffer *b;
	  b=BufferFromString(file);
	  posSlash=strrchr(BufferString(b),'/');
	  posSlash[0]='\0';
	  HfdCreateDir (BufferString(b));
	  BufferFree (b);
	}
      fileOutput=fopen(file, "a");
    }
  else
    {
      fileOutput=fopen(file, "a");
    }
  return fileOutput;
}

    int getopt();
    extern char *optarg;

int main(int argc, char **argv)
{
  int cod_arg;
  char *fileName=NULL;
  FILE *fileOutput;
  Buffer *rec;

  rec=BufferCreate(100,100);

  while ((cod_arg = getopt(argc,argv,"f:"))!=EOF)
    {switch(cod_arg) 
      {
      case 'f':
	fileName=optarg;
	break;
      }
    }
  if(fileName)
    {
      fileOutput=HfdFileOpenWrite(fileName);
      while(BufferGets(rec))
	{
	  fprintf(fileOutput, "%s\n", BufferString(rec));
	}
    }
  else
    {
      RegExp *fileRE;
      RegExp *appendFileRE;
      Buffer *bufFileName;
      char *posFile;
      char *posDquot;

      fileRE=RegExpCreate("file[ ]*=[ ]*\"");
      appendFileRE=RegExpCreate("appendFile[ ]*=[ ]*\"");
      fileOutput=NULL;
      bufFileName=BufferCreate(10,10);

      while(BufferGets(rec))
	{
	  if (strncmp(BufferString(rec),"<?dilib",7)==0)
	    {
	      if (fileOutput)fclose(fileOutput);
	      if ((posFile=RegExpAfter(fileRE, BufferString(rec)))
		  &&(posDquot=strchr(posFile,'\"')))
	       
		{
		  BufferStrncpy(bufFileName, posFile, posDquot-posFile);
		  fileOutput=HfdFileOpenWrite(BufferString(bufFileName));
		}
	      else
		{
		  if ((posFile=RegExpAfter(appendFileRE, BufferString(rec)))
		      &&(posDquot=strchr(posFile,'\"')))
		    
		    {
		      BufferStrncpy(bufFileName, posFile, posDquot-posFile);
		      fileOutput=HfdFileOpenAppend(BufferString(bufFileName));
		    }
		}
	    }
	  else
	    {
	      if (fileOutput)fprintf(fileOutput, "%s\n", BufferString(rec));
	    }
	}
    }

  exit (0);
  return 0;
}
