//------------------------------------------------------------
// $Id: fileUtil.cc,v 1.1.1.1 1999/11/25 06:26:12 yamauchi Exp $
//------------------------------------------------------------
//	fileUtil.cc
//	1998年12月22日(火)
//	Copyright (C) 1998  YAMAUCHI Hitoshi 山内 斉
// 
// FILE *getOpenedFp(const char *pFilename)
//	名前の check と open check を行ない open できなかった場合には 
//	NULL を返す．失敗の場合は message が出力される．
//	@param pFilename 	
//
// FILE *getUniqueWriteFP(const char *pCandidateWriteFname, char *ResBuf,
//			  int resbufsize)
//	write で file を open する．ただし，指定したファイルが存在する
//	場合には，mktemp を用いて新たなファイル name を生成して write 
//	で open を試みる．
//      @param pCandidateWriteFname write で open したいファイル名
//      @param pResBuf 最終的に open したファイル名をこの buf にコピー
//             して返す．NULL を渡した場合にはコピーしない．
//      @param resbufsize pResBuf の大きさ
//      @return open した FILE *．失敗した場合には NULL が返る．
//------------------------------------------------------------
#include <stdio.h>
#include <iostream.h>
#include <unistd.h> 		// extern "C" char *mktemp(char *);
#include <stdlib.h>
#include <string.h>
#include "constants.h"
#include "strnew.h"

#ifdef MPI2
#include "mpi2exit.h"
static void fileUtil_exit(int err)
{
    commMpi2_exit(err);
}
#else
static void fileUtil_exit(int err)
{
    exit(err);
}
#endif

//------------------------------------------------------------
// return opened FILE* for read, with check filename and open test.
// 	close は必要
//------------------------------------------------------------
FILE *getOpenedFp(const char *pFileName)
{
    if((pFileName == NULL) || (pFileName[0] == '\0'))
    {
	cout << "Error! : illegal file name  [" << pFileName << "]" << endl;
	return(NULL);
    }
    
    FILE *pfp = fopen(pFileName, "r");
    if(pfp == NULL)
    {
	cout << "Error! : can not open [" << pFileName << "]" << endl;
	return(NULL);
    }
    else 
    {
	return(pfp);
    }
}

//------------------------------------------------------------
// return opened FILE* for write, with check filename and open test
// and ensure no override file.
// 	close は必要
//   名前が変更された場合にはその名前を pResBuf に書いて返す
//   変更された名前が欲しくない場合には pResBuf = NULL としておく．
//------------------------------------------------------------
FILE *getUniqueWriteFP(const char *pCandidateWriteFname, char *pResBuf, 
		       const int resbufsize)
{
    // file が存在するかを確認
    FILE *pfp = fopen(pCandidateWriteFname, "r");
    if(pfp == NULL)		
    {
	// ファイルは存在しない。write で open する
	if((pfp = fopen(pCandidateWriteFname, "w")) == NULL)
	{
	    // でも開けない．．．fail
	    cout << "Error! : there is no file [" << pCandidateWriteFname << 
	    "], but can't open the file with write mode." << endl;
	    fileUtil_exit(1);
	}else
	{
	    // normail exit
	    if(pResBuf != NULL)
	    {
		if(resbufsize <= (int)strlen(pCandidateWriteFname))
		{
		    cout << "Warning! : shortage of resbufsize. "
		    	    "truncated. at getUniqueWriteFP(). [" << 
			    pCandidateWriteFname << "]" << endl;
		}
		strncpy(pResBuf, pCandidateWriteFname, resbufsize);
	    }
	}
    }
    else
    {
	// ファイルが存在するので閉じて他のファイルをテストする
	cout << "Warning! : There is [" << pCandidateWriteFname << "]. " << 
	    "I will try to new filename by mktemp." << endl;
	fclose(pfp);
	pfp = NULL;

	// try to make temporary file
	char *pTmpfname = strnew(pTEMP_SAVE_IMAGE_FILENAME);
	strncpy(pTmpfname, pTEMP_SAVE_IMAGE_FILENAME, resbufsize);
	if(mktemp(pTmpfname) == NULL)
	{
	    cout << "Error! : I can not make unique tmpfilename " << 
		"at getUniqueWriteFP." << endl;
	    fileUtil_exit(1);
	}
	if((pfp = fopen(pTmpfname, "w")) == NULL)
	{
	    cout << "Error! : can't open " << pTmpfname << 
	    " to write at getUniqueWriteFP." << endl;
	    fileUtil_exit(1);
	}else
	{
	    cout << "Warning! : mktmp succeeded. writing filename is  [" << 
	    pTmpfname << "] instead of [" << pCandidateWriteFname <<
	    "]" << endl;
	    if(pResBuf != NULL)
	    {
		if(resbufsize <= (int)strlen(pTmpfname))
		{
		    cout << "Warning! : shortage of resbufsize. "
		    	    "truncated. at getUniqueWriteFP(). [" <<
			    pTmpfname << "]" << endl;
		}
		strncpy(pResBuf, pTmpfname, resbufsize);
	    }
	}
	strdel(pTmpfname);
    }
    return(pfp);
}
