/***************************************
*                                      *
*   財政検証標準フォーマット対応関数   *
*                                      *
*                                      *
***************************************/

#include <iostream>
#include <cstdlib>
#include <ctime>
#include "snaps.h"
#include "cntl.h"


// double型のデータ読み込み
int read_data( double buffer[] , FILE *fp , int *data_number_ptr )
{
	int c;
	int previous_c;
	int data_number;
	int comma_number;
	char s[BUFFER_MAX];
	char *sptr;
	
	using namespace std;
	
	// 初期化
	data_number = -1;
	comma_number = 0;
	sptr = s;
	
	// fp から１文字cに取得する。
	while( ( ( c = fgetc(fp) ) != EOF) && ( c != '\n' ) )
	{
		// cが区切り文字の場合
		if( c == ',' )
		{
			if( ++comma_number > DATA_MAX )
			{
				cout << "エラー(in read_data) １行の中のカンマの数が " << DATA_MAX << " 個を超えています" << endl;
				exit( 1 );
			}
			
			if( sptr - s > BUFFER_MAX-1)
			{
				cout << "エラー(in read_data) １つのデータの文字数が " << BUFFER_MAX - 1 << " 個を超えています" << endl;
				exit( 1 );
			}
			
			*sptr = '\0';
			
			buffer[++data_number] = atof(s);
			
			sptr = s;
		}
		else
		{
			*sptr++ = c;
		}
		
		previous_c = c;
	}
	
	// 終了処理
	// 直前の取得文字がカンマでない場合
	if( previous_c != ',' )
	{
		if( ++comma_number > DATA_MAX )
		{
			cout << "エラー(in read_data) １行の中のカンマの数が " << DATA_MAX << " 個を超えています" << endl;
			exit( 1 );
		}
		
		if ( sptr - s > BUFFER_MAX - 1 )
		{	
			cout << "エラー(in read_data) １つのデータの文字数が " << BUFFER_MAX - 1 << " 個を超えています" << endl;
			exit( 1 );
		}
		
		*sptr = '\0';
		
		buffer[++data_number] = atof(s);
	}
	
	*data_number_ptr = data_number;
	
	if( c == EOF )
	{
		return( EOF );
	}
	else
	{
		return( 0 );
	}
}


// ヘッダの読み込み処理
void read_headder( FILE *fp )
{
	// 変数宣言
	char char_buffer[257];
	int seido;
	int system;
	int jouhou;
	int Done;
	
	Done = 0;
	
	while( Done == 0 && fgets( char_buffer , 256 , fp ) != NULL )
	{
		if( char_buffer[0] == '#' )
		{
			sscanf( char_buffer, "#%d-%d-%d" , &seido , &system , &jouhou );
			if( seido == 99 )
			{
				Done = 1;
			}
		}
	}
}


void write_BeginData( FILE *fp )
{
	time_t w_time;
	struct tm *w_tm;
	
	// 実行時間出力
	time( &w_time );
	w_tm = localtime( &w_time );
	
	fprintf( fp , "%s", asctime( w_tm ) );
	
	// データ部識別子を出力
	fprintf( fp , "#99-0000-0000\n" );
}


// バージョン確認
void VersionConfirm()
{
	// 変数宣言
	FILE *fp_version;
	FILE *fp_version_cut;
	char answer;
	
	using namespace std;
	
	if( ( fp_version = fopen( "Version" , "r" ) ) == NULL )
	{
		cout << "バージョンファイルのオープンに失敗しました" << endl;
		exit( 1 );
	}
	
	fgets( Version , 100 , fp_version );
	fclose( fp_version );
	
	if( ( fp_version_cut = fopen( "Version_cut" , "r" ) ) == NULL )
	{
		cout << "バージョンファイル（カット）のオープンに失敗しました" << endl;
		exit( 1 );
	}
	
	fgets( Version_cut , 100 , fp_version_cut );
	fclose( fp_version_cut );
	
	cout << "The version number of this run is " << Version << "-" << Version_cut << "." << endl;
	cout << "OK? (press 'y' for yes)" << endl;
	cin >> answer;
	if ( answer != 'y' )
	{
		cout << "Version Error. Execution terminated." << endl;
		exit( 1 );
	}
}

// round関数
int Round( double a , int b )
{
	int c;
	int d;
	int i;
	int S;
	
	S = 1;
	for( i = 1 ; i <= b ; i++ )
	{
		S *= 10;
	}
	a /= S;
	d = (int)( a + 0.5 );
	c = d * S;
	
	return( c );
}

// 最大値
double max( double a , double b )
{
	return( ( a > b ) ? a : b );
}

// 最小値
double min( double a , double b )
{
	return( ( a < b ) ? a : b );
}
