//==============================================================================================================================
//	変換ルーチンベースプログラム
//
//
//==============================================================================================================================

//------------------------------------------------------------------
//		スクリプトコマンドクラス
//------------------------------------------------------------------
class DUMP
{
	BOOL		m_bInitialized;
	BOOL		m_bImplemented;
	
public:
	void		Initialize();
//	int			Func(char *path,char *outname,int ar);
	int			Func( LPCTSTR _sParamString );
	void		Quit( BOOL _bExit );
	
	DUMP();
	~DUMP();
	
};

DUMP::DUMP()
	: m_bInitialized( FALSE )
	, m_bImplemented( FALSE )
{
}
DUMP::~DUMP(){
}
//----	ここより上は変更の必要なし(変数等の追加は自由)


//------------------------------------------------------------------
//		スクリプトコマンドの初期化
//			(特に必要ないなら変更の必要なし)
//------------------------------------------------------------------
void	DUMP::Initialize()
{
	
	if( m_bInitialized == TRUE )	return;
	m_bInitialized = TRUE;	//	初期済みフラグ
	
	//	処理開始前に一回だけ行う初期化はここで
	
	
}

//------------------------------------------------------------------
//		スクリプトコマンドの終了
//			(特に必要ないなら変更の必要なし)
//------------------------------------------------------------------
void	DUMP::Quit( BOOL _bExit )
{
	
	if( m_bImplemented == FALSE )	return;
	m_bImplemented = FALSE;
	m_bInitialized = FALSE;
	
	//終了処理
	//	終了処理は変換処理が実行された場合のみ行う
	
}


#define	DUMP_OUTAREA		8	//	変換後の容量は仮に倍取っている　内容によって変更して下さい


//------------------------------------------------------------------
//	変換フィルターサンプル　機能:無変換(ファイルコピー)
//			変換せず調査だけなら out に関する部分は不要
//------------------------------------------------------------------
int		DUMP::Func( LPCTSTR _sParamString )
{
	CSwbParam	cParam( _sParamString );							///< パラメータ処理.
	
	LPCTSTR	sPath;
	LPCTSTR	sOutName;
	int		iAr;
	TCHAR	drive[_MAX_DRIVE], dir[_MAX_DIR], name[_MAX_FNAME], ext[_MAX_EXT], temp[_MAX_PATH];
	char	*mem=NULL;
	TCHAR	*out=NULL;
	DWORD	ii,jj,uLen;
	
	
	sPath		= cParam.GetPath();		///< ターゲットファイル (GetFilePath(0)としても同じ).
	if( cParam.IsParam( 2 ) ){
		sOutName	= cParam.GetString(1);
		iAr			= cParam.GetInt(2);
	}else{
		iAr			= cParam.GetInt(1);
	}
	
	Initialize();
	
	
	uLen = FILE_GetFileSize( sPath );
	if(uLen == 0)	return FALSE;
	
	//DWORDの不足分を 0 で埋めるため
	mem_alloc( char, mem, uLen+3 );
	memset( (char*)mem, 0, uLen+3 );
	uLen = FILE_TargetRead( sPath, mem );
	
	//	変換後のデータバッファを確保
	mem_alloc( TCHAR, out, uLen*DUMP_OUTAREA );	//余裕みて８倍★★ std仕様に変えたい
	
	m_bImplemented = TRUE;	//	実行済みフラグ
	
	ii = jj = 0;
	*out = 0;
	switch( iAr )
	{
		default:
			while(ii < uLen){
				wsprintf( temp, TEXT("0x%02x,"), *((BYTE*)mem+ii) );
				if((ii%16)==15)	STRING_cat( temp, TEXT("\r\n") );
				STRING_cpy( out+jj, temp );
				jj += STRING_len(temp);
				ii++;
			}
			break;
		case 2:
			while(ii < (uLen+1) / 2){
				wsprintf( temp, TEXT("0x%04x,"), *((WORD*)mem+ii) );
				if((ii%16)==15)	STRING_cat( temp, TEXT("\r\n") );
				STRING_cpy( out+jj, temp );
				jj += STRING_len(temp);
				ii++;
			}
			break;
		case 4:
			while(ii < (uLen+3) / 4){
				wsprintf( temp, TEXT("0x%08x,"), *((DWORD*)mem+ii) );
				if((ii%8)==7)	STRING_cat( temp, TEXT("\r\n") );
				STRING_cpy( out+jj, temp );
				jj += STRING_len(temp);
				ii++;
			}
			break;
	}
	STRING_cpy( out+jj, TEXT("\r\n") );
	jj += sizeof("\r\n") - 1;
	
	
	//	変換された out を出力　　出力ファイル名はバッチで指定、特に指定されていなければ元と同じファイル名
	
	if( 0>=STRING_len(sOutName) )	STRING_cpy( temp, sPath );		//	出力パスが指定されていない時、元のパス
	else							STRING_cpy( temp, sOutName );	//	出力パスが指定されている
	
	FILE_split( temp, drive, dir, name, ext );
//	FILE_merge( temp, drive, dir, name, ext );	//ここでは分解した物をそのまま連結、拡張子等を変えたい時はここで
	if( STRING_cmp( ext, TEXT(".txt"))==0 || STRING_cmp( ext, TEXT(".TXT"))==0 )	STRING_cat( name, TEXT("_d") );
	FILE_merge( temp, drive, dir, name, TEXT(".txt") );	//拡張子を".txt"に変えるサンプル
	
	//	Infoメッセージ出力(改行コードは\r\n)
	Message_printf( TEXT("dump:%s %s.txt"), sPath, name );
	
	
	//	ファイル出力(バックアップ作成)
	file_textwrite( temp, out );
	
	//	メモリを開放
	mem_del(mem);
	mem_del(out);
	
	return TRUE;
}


DUMP	*pC_dump = NULL;
