//********************************************************************************************
/**
 * @file		smpl_d2atex.cpp
 * @brief		幕末用 d2aテクスチャ名変更
 *
	もっとも単純な構造のサンプルプログラム.
 *
	@date		2013/02/19	takedan	新規作成.
 */
//********************************************************************************************

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


//********************************************************************************************
/**
 * @class		SMPL_D2ATEX
 * @brief		幕末用 d2aテクスチャ名変更スクリプトコマンドクラス.
 */
//********************************************************************************************
class SMPL_D2ATEX
{
public:
	virtual int		Func( LPCTSTR _sParamString );
	virtual void	Quit( BOOL _bExit ){}
};



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

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

//********************************************************************************************
/**
 * @brief		幕末用 d2aテクスチャ名変更変換フィルターサンプル　機能:無変換(ファイルコピー)
 *				変換せず調査だけなら pOut に関する部分は不要.
 *
 * @param[in]	LPCTSTR	_sParamString	引数文字列  ターゲットファイル名 + スクリプトで指定する引数.
 *
 * @return		int	TRUE:成 / FALSE:否(デフォルト)
 */
//********************************************************************************************
int		SMPL_D2ATEX::Func( LPCTSTR _sParamString )
{
	CSwbParam	cParam( _sParamString );							///< パラメータ処理.
	
	TCHAR	*pMem = NULL;
	TCHAR	*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( TCHAR, pOut, ((iSourceLength*SMPL_D2ATEX_OUTAREA+1023)/1024)*1024 );
	
	
	Int32		iLastStrBegin = -1;
	Int32		jLastStrBegin = -1;
	
	/// 変換処理部分.
	ii = jj = 0;
	while( ii < iSourceLength )
	{
		if( *(pMem+ii) == '"' )
		{
			iLastStrBegin = ii+1;
			jLastStrBegin = jj+1;
		}
		
		if( STRING_buffcmp( (pMem+ii), TEXT(".tga"), NULL ) && 0<iLastStrBegin )
		{
			Int32	bi = ii, bj = jj;
			ii = iLastStrBegin;
			jj = jLastStrBegin;
			
			TCHAR	cTemp[ 256 ];
			STRING_cpy( cTemp, szFileName );
			cTemp[ 8 ] = '\0';
			
			BUF_copy( (char*)(pOut+jj), (char*)cTemp, 8*2 );	//!< UNICODEなので*2
			ii = bi;
			jj = bj;
		}
		
		*(pOut+jj++) = *(pMem+ii++);
		
	}
	*(pOut+jj++) = '\0';
	
	/// 変換された pOut を出力　　出力ファイル名はバッチで指定、特に指定されていなければ元と同じファイル名.
//	file_targetwrite( szOutName, pOut, jj );			///< 出力.
	file_textwrite( szOutName, pOut );					///< UNICODEの場合 S-JISに戻して書き込み.
	
	
	/// メモリを開放.
	mem_del( pMem );
	mem_del( pOut );
	
	return TRUE;
}


SMPL_D2ATEX	*pC_smpl_d2atex = NULL;

#endif	// SW_MODULE_SMPL_D2ATEX
