//********************************************************************************************
/**
 * @file		
 * @brief		
 *
	もっとも単純な構造のサンプルプログラム.
 *
	@date		新規作成.
 */
//********************************************************************************************

#define	SW_MODULE_FUNCTION_BASE						///< この機能を切り離したい時はコメントアウト.
#ifdef	SW_MODULE_FUNCTION_BASE


//********************************************************************************************
/**
 * @class		FUNCTION_BASE
 * @brief		スクリプトコマンドクラス.
 */
//********************************************************************************************
class FUNCTION_BASE
{
public:
	virtual int		Func( LPCTSTR _sParamString );
	virtual void	Quit( BOOL _bExit ){}
};



//==============================================================================================================================================
//	変換処理部分
//==============================================================================================================================================

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

//********************************************************************************************
/**
 * @brief		変換フィルターサンプル　機能:無変換(ファイルコピー)
 *				変換せず調査だけなら pOut に関する部分は不要.
 *
 * @param[in]	LPCTSTR	_sParamString	引数文字列  ターゲットファイル名 + スクリプトで指定する引数.
 *
 * @return		int	TRUE:成 / FALSE:否(デフォルト)
 */
//********************************************************************************************
int		FUNCTION_BASE::Func( LPCTSTR _sParamString )
{
	CSwbParam	cParam( _sParamString );							///< パラメータ処理.
	
	char	*pMem = NULL;
	char	*pOut = NULL;
	int		ii, jj, iSourceLength;
	LPCTSTR	szFileName, szOutName;
	
	
	/// 引数の取り出し.
	szFileName = cParam.GetPath();		///< ターゲットファイル (GetString(0)としても同じ).
	szOutName  = cParam.GetOutPath();	///< 出力パスを取得(%0等は変換されている).
	
	
	/// 元データ読み込み(関数内部でpMemに領域を確保している).
	iSourceLength = MEM_TargetRead( &pMem, szFileName );						///< バイナリーデータとしてベタ読み.
//	iSourceLength = MEM_TextRead( &pMem, szFileName );							///< UNICODEの場合 UTF16に変換されて読まれます.
	if(iSourceLength == 0)	return FALSE;		///< ファイルがない.
	
	
	/// 変換後のデータバッファを確保	元データがあまりに小さい場合があるので最低1KBは確保.
	mem_alloc( char, pOut, ((iSourceLength*FUNCTION_BASE_OUTAREA+1023)/1024)*1024 );
	
	
	
	/// 変換処理部分.
	ii = jj = 0;
	while( ii < iSourceLength )
	{
		/// 変換処理 このサンプルではただコピーしているだけ.
		*(pOut+jj++) = *(pMem+ii++);
	}
	
	
	
	/// Infoメッセージ出力(改行コードは\r\n)
	Message_printf( TEXT("file:%s %s"), szFileName, szOutName );
	
	
	/// 変換された pOut を出力　　出力ファイル名はバッチで指定、特に指定されていなければ元と同じファイル名.
	file_targetwrite( szOutName, pOut, jj );			///< 出力.
//	file_textwrite( szOutName, pOut );					///< UNICODEの場合 S-JISに戻して書き込み.
	
	
	/// メモリを開放.
	mem_del( pMem );
	mem_del( pOut );
	
	return TRUE;
}


FUNCTION_BASE	*pC_function_base = NULL;

#endif	// SW_MODULE_FUNCTION_BASE
