//********************************************************************************************
/**
 * @file		_common.cpp
 * @brief		標準内蔵機能
	
		内蔵機能を include したもの. 内蔵機能は cppをincludeする必要はないが swriterと合わせ.
		ソースを分けるほどでもない機能はここに直置き.
 * 
 * @author		N.Takeda
 */
//********************************************************************************************

#define	SW_MODULE_COMMON

//		標準内蔵機能
int		file_del( LPCTSTR path );
Int32	delete_rem( LPCTSTR _sParamString );
int		filt_excessiveSPACE( LPTSTR ptr, int len );
int		filt_zen2han( LPCTSTR _sParamString );



//	内蔵機能に関するモジュール
#include "common\filecopy.cpp"
#include "common\kanji_check.cpp"
#include "common\zen2han.cpp"
#include "common\listsort.cpp"
#include "common\filecheck.cpp"
#include "common\dump.cpp"
#include "common\samesize.cpp"
#include "common\chgrw.cpp"


//↓そのうち各クラスに内包しよう
static	int	msged_copy = 0;
static	int	msged_defrem = 0;


//------------------------------------------------------------------------------
//		終了処理
//------------------------------------------------------------------------------
static	void	common_quit( BOOL _bExit )
{
//		#define		QUIT(class)		if( class != NULL)	class->Quit( _bExit )
	
	msged_copy = 0;
	msged_defrem = 0;
	
	QUIT( pC_filecopy );
	QUIT( pC_listsort );
	QUIT( pC_filecheck );
	QUIT( pC_dump );
	QUIT( pC_kchk );
	QUIT( pC_samesize );
	QUIT( pC_chgrw );
	
}


//------------------------------------------------------------------------------
//		ファイルを削除
//------------------------------------------------------------------------------
int		file_del( LPCTSTR path )
{
	
	if(path[0] == 0)	return 0;
	
	return FILE_delete( path );
}


//********************************************************************************************
/**
 * @brief		注釈を削除
 *				文字列("で括られる文字)中の注釈記号は除外します
 * @author		N.Takeda
 * @date		2011/06/02(木) 15:47:58
 *
 * @param[in]	LPCTSTR	_sParamString	文字列.
 *
 * @return		Int32	
 */
//********************************************************************************************
Int32	delete_rem( LPCTSTR _sParamString )
{
	CSwbParam	cParam( _sParamString );										///< パラメータ処理.
	
	TCHAR		*pMem = NULL;
	LPCTSTR		pLineMark = NULL, pRmStMark = NULL, pRmEdMark = NULL;
	Int32		iFSize;
	LPCTSTR		sPath;
	LPCTSTR		sOutPath;
	
	sPath    = cParam.GetPath();												///< ターゲットファイル.
	sOutPath = cParam.GetOutPath();
	
	iFSize = MEM_TextRead( &pMem, sPath );
	if( 0 >= iFSize )
	{
		Message_error( TEXT("not found.%s"), pickup_name( sPath ) );
		return 0;
	}
	
	/// 指定されていない時はデフォルトではなく 空文字になる.
	pLineMark = cParam.GetStringOption( 'L', TEXT("//") );
	pRmStMark = cParam.GetStringOption( 'S', TEXT("/*") );
	pRmEdMark = cParam.GetStringOption( 'E', TEXT("*/") );
	
	iFSize = FILT_deleteREM( pMem, iFSize, pLineMark, pRmStMark, pRmEdMark, '\"' );	///< 行注釈記号,範囲注釈記号始点,範囲注釈記号終点,文字列とする記号.
	iFSize = FILT_excessiveSPACE( pMem, iFSize );
	
	/// 変換された out を出力　　出力ファイル名はバッチで指定、特に指定されていなければ元と同じファイル名.
	iFSize = file_textwrite( sOutPath, pMem );
	
	mem_del( pMem );
	
	return iFSize;
}


//------------------------------------------------------------------------------
//		全角を半角に
//------------------------------------------------------------------------------
int		filt_zen2han( LPCTSTR _sParamString )
{
	CSwbParam	cParam( _sParamString );							///< パラメータ処理.
	
	TCHAR		*pMem = NULL;
	int			iLen, olen;
	xstring		sPath;
	xstring		sOutPath;
	
	
	sPath     = cParam.GetPath();		///< ターゲットファイル.
	sOutPath  = cParam.GetOutPath();	///< 第1引数をファイルパスとして取得(%0等が変換されて得られる).
	
	iLen = MEM_TextRead( &pMem, sPath.c_str() );
	if( iLen == 0 ){
		Message_error( TEXT("zen2han  failed. %s"), sPath.c_str() );
		return 0;
	}
	
	olen = FILT_zen2han( (u_char*)pMem, iLen );
	
	if( sOutPath.empty()  )
		file_textwrite( sPath.c_str(), pMem );
	else
		file_textwrite( sOutPath.c_str(), pMem );
	
	mem_del( pMem );
	
	Message_printf( TEXT("zen2han %s %dKb->%dKb"), cParam.GetName( 0 ), (iLen+1023)/1024, (olen+1023)/1024 );
	
	return 1;
}
