//------------------------------------------------------------
// $Id: getopt.cc,v 1.1.1.1 1999/11/25 06:26:12 yamauchi Exp $
//------------------------------------------------------------
//	mpi2 getoption
//	1996/9/29
//	(C) 1996-1998 Copyright YAMAUCHI Hitoshi 山内 斉
//------------------------------------------------------------
#include <stdio.h>
#include <iostream.h>

#include "mpi2exit.h"
#include "Option.h"
#include "FileInfo.h"
#include "constants.h"
#include "mpi2_funcs.h"

//------------------------------------------------------------
// get command line option
//------------------------------------------------------------
void getOption(int argc, char *argv[], FileInfo *pCommandLineFinfo)
{
    const char * const com_name = argv[0];

    for(int arg_num = 1; arg_num < argc; arg_num++)
    {
	char *opt_word = argv[arg_num];	// 各語ごとに解析
	if(opt_word[0] != '-')
	{
	    cout << "Error!: illegal command: " << opt_word << endl;
	}
	const int word_len = strlen(opt_word);
	for(int char_num = 1; char_num < word_len; char_num++)
	{
	    switch(opt_word[char_num])
	    {
	    case 'd':
		Option::getInstance()->setDebugMode();
		break;
	    case 'h':
		usage(com_name);
		break;
	    case 's':
		Option::getInstance()->setShowData();
		break;
	    case 'S':
		Option::getInstance()->setShowNumobjInSpace();
		break;
	    case 'v':
		Option::getInstance()->setVerboseMode();
		break;

	    case '-':
		char_num++;	// 続く言葉は spc,mat,geo,sys など
		arg_num++;	// 続くファイル名取得
		if(arg_num >= argc)
		{
		    cout << "Error!: no filename is specified" << endl;
		}
		if(strcmp("conf", &opt_word[char_num]) == 0)
		{
		    pCommandLineFinfo->setConfigFileName(argv[arg_num]);
		    char_num = word_len; // ここはもう１文字ずつ見なくて良い
		}
		else if(strcmp("spc", &opt_word[char_num]) == 0)
		{
		    pCommandLineFinfo->setSpcFileName(argv[arg_num]);
		    char_num = word_len; // ここはもう１文字ずつ見なくて良い
		}else if(strcmp("mat", &opt_word[char_num]) == 0)
		{
		    pCommandLineFinfo->setMatFileName(argv[arg_num]);
		    char_num = word_len; 
		}else if(strcmp("geo", &opt_word[char_num]) == 0)
		{
		    pCommandLineFinfo->setGeoFileName(argv[arg_num]);
		    char_num = word_len; 
		}else if(strcmp("vinl", &opt_word[char_num]) == 0)
		{
		    pCommandLineFinfo->setVolumeInFileListName(argv[arg_num]);
		    char_num = word_len; 
		}else if(strcmp("sys", &opt_word[char_num]) == 0)
		{
		    pCommandLineFinfo->setSysInfoFileName(argv[arg_num]);
		    char_num = word_len;
		}else if(strcmp("view", &opt_word[char_num]) == 0)
		{
		    pCommandLineFinfo->setViewDataFileName(argv[arg_num]);
		    char_num = word_len;
		//tokunaga
		}else if(strcmp("dis", &opt_word[char_num]) == 0)
		{
		    pCommandLineFinfo->setDistanceDataFileName(argv[arg_num]);
		    char_num = word_len;
		}else if(strcmp("saveppm", &opt_word[char_num]) == 0)
		{
		    pCommandLineFinfo->setSaveResultFileName(argv[arg_num]);
		    pCommandLineFinfo->
		    	setSaveFileFormat(FileInfo::FI_SAVE_PPM);
		    char_num = word_len;
		}else if(strcmp("savegfb", &opt_word[char_num]) == 0)
		{
		    pCommandLineFinfo->setSaveResultFileName(argv[arg_num]);
		    pCommandLineFinfo->
		    	setSaveFileFormat(FileInfo::FI_SAVE_GFB);
		    char_num = word_len;
		}else if(strcmp("rado", &opt_word[char_num]) == 0)
		{
		    pCommandLineFinfo->setRadioStageOutFileName(argv[arg_num]);
		    char_num = word_len;
		}else
		{
		    cout << "Error!:illegal option:" << opt_word << endl;
		}
		break;
	    
	    default:
		cout << "Error! : no such option." << opt_word << endl;
		break;
	    }
	}
    }
    // 懐かしい．昔，gcc が if の中の代入に warning を出さなかった頃，
    // このように定数を左辺に書いて誤り (if(a = b);)を防止していた．今
    // は読みにくい(この場合 YES と何かを比較したいのではなく，option 
    // が YES かどうか知りたいので逆になって思考に厳しい．)のでやらな
    // いが，懐しいコードなので保存しておこう． 
    // 		1998年12月15日(火) 山内
    // 最終的なファイル名などは config file と Option の両方がそろって
    // はじめて決まるのでそれまで出力できない．
    //     if(YES == Option::getInstance()->getVerboseMode()) 
    //     {
    // 	int rank = 0;
    // 	if(rank == SysStat::get()->getHostRank())
    // 	{
    // 	    char buf[128];
    // 	    sprintf(buf, "%s Host:: ", VERBOSEHEAD);
    // 	    Option::getInstance()->print(buf);
    // 	}
    //     }
}


//------------------------------
// set fileinfo
//     もし Option に -fconf があれば読む．
//     その後に command line option で上書きする．
//------------------------------
void setFileInfo(const FileInfo &commandLineFinfo)
{
    FileInfo *pFI = FileInfo::getInstance();

    // -fconf 指定がある場合には config file を読む
    if(commandLineFinfo.getConfigFileName() != "")
    {
	pFI->setConfigFileName(commandLineFinfo.getConfigFileName());
	pFI->readConfigFile();
    }
    // コマンドライン option で上書きする
    pFI->overrideFileInfoWithOption(&commandLineFinfo);

    if(Option::getInstance()->getVerboseMode() == YES)
    {
	Option::getInstance()->print("# host::");
    }
}
