/**********************************************************************
*
*  projet   : DilibPro
*  module   : Dam  (Dilib Acces Method)
*  fichier  : DamStreamIter.c
*  Auteur   : Jacques DUCLOY
*  Date     : Fevrier 94
*  $Id: DamStreamIter.c,v 1.3 2005/07/11 16:17:21 parmentf Exp $
*
***********************************************************************
* 
*     Copyright (C) 1975 CRIN - CNRS & INRIA Lorraine
*
***********************************************************************/

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

#include "DamHfd.h"
#include "Buffer.h"


DamStreamIterator *DamStreamIteratorCreate(char **listName)
{
  DamStreamIterator *iter;
  iter = (DamStreamIterator *) malloc(sizeof(DamStreamIterator));
  iter->listEntry=listName;
  iter->hfdExploring=0;
  iter->indicEntry=0;
  iter->stdinHasBeenReaded=0;
  iter->oneStreamHasBeenReaded=0;
  iter->listIsClosed=0;
  iter->hfdIterator=DamHfdIteratorCreate();
  return iter;
}


FILE* DamNextStream(DamStreamIterator *iter)
{
  char *currentStream;
  if(iter->listIsClosed)return NULL;
  if(iter->oneStreamHasBeenReaded)fclose(iter->currentFile);
  if(iter->hfdExploring)
    {
      if((iter->currentHfdPath=DamHfdNextFilePath(iter->hfdIterator)))
	{
	  iter->currentFile=fopen(iter->currentHfdPath,"r");
	  return (iter->currentFile);
	}
      else iter->hfdExploring=0;
    }
  if((currentStream=iter->listEntry[iter->indicEntry++]))
    {
      iter->oneStreamHasBeenReaded=1;
      if (strcmp(currentStream,"-")==0)
	{
	  if(iter->stdinHasBeenReaded)return NULL;
	  iter->stdinHasBeenReaded=1;
	  iter->currentFile=stdin;
	}
      else
	{
	  static Buffer* bPath=NULL;
	  char *cleanStream;
	  if ((currentStream[strlen(currentStream)-1])=='/')
	    {
	      if(!bPath)bPath=BufferFromString(currentStream);
	      else BufferStrcpy(bPath, currentStream);
	      BufferTailCut(bPath,1);
	      cleanStream=BufferString(bPath);
	    }
	  else cleanStream=currentStream;

	  if(DamNameIsDir(cleanStream))
	    {
	      iter->hfdExploring=1;
	      DamHfdIteratorInit(iter->hfdIterator,cleanStream);
	      iter->currentHfdPath=DamHfdNextFilePath(iter->hfdIterator);
	      iter->currentFile=fopen(iter->currentHfdPath,"r");
	    }
	  else
	    {
	      iter->currentFile=fopen(cleanStream,"r");
	    }
	}
    }
  else
    {
      iter->listIsClosed=1;
      if(iter->stdinHasBeenReaded)return NULL;
      if(iter->oneStreamHasBeenReaded)return NULL;
      iter->stdinHasBeenReaded=1;
      iter->currentFile=stdin;
    }
  return (iter->currentFile);
}
