/*-----------------------------------------------------------------------------
[名称]	WhitespaceDefine.h
[概要]	空白文字定義クラスの実装
[備考]	なし
[履歴]	2002-12-12	NC		コメント付加(moralog)
-----------------------------------------------------------------------------*/

//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "Shitarabian.h"
#include "WhitespaceDefine.h"
#include "Common.h"
#include "ExeCommon.h"
#include "SettingPath.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


//-----------------------------------------------------------------------------
// 定数
//-----------------------------------------------------------------------------
static const CString	f_strIniFileName = "whitespace.ini";	// 設定ファイル名称


/*-----------------------------------------------------------------------------
[名称]	コンストラクタ
[機能]	インスタンスの生成。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CWhitespaceDefine::CWhitespaceDefine()
{

}


/*-----------------------------------------------------------------------------
[名称]	デストラクタ
[機能]	インスタンスの破棄。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CWhitespaceDefine::~CWhitespaceDefine()
{

}


/*-----------------------------------------------------------------------------
[名称]	ファイル書き出し
[機能]	空白文字定義をファイルへ書き出す。
[戻値]	BOOL 処理結果 [-] (TRUE:成功、FALSE:失敗)
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL	CWhitespaceDefine::Write()
{
	CString		strFilename = CSettingPath::GetInstance()->GetFolderPath() + f_strIniFileName;

	try
	{
		CStdioFile	file( strFilename, CFile::modeCreate | CFile::modeWrite );

		// バージョンの書きだし
		CString		strVersion;
		strVersion.LoadString( IDS_RELEASE_VERSION );
		file.WriteString( strVersion + "\n" );

		// 空白文字定義の書き出し
		int	idxChar;
		for( idxChar=0 ; idxChar<m_aCharz.GetSize() ; idxChar++ )
		{
			CString	strChar;
			strChar.Format(
				"%s\n%s\n%s\n%s\n%s\n",
				QuoteString( m_aCharz[idxChar].strChar ),
				BoolToString( m_aCharz[idxChar].bEnable ),
				BoolToString( m_aCharz[idxChar].bCanContinuation ),
				BoolToString( m_aCharz[idxChar].bCanHead ),
				LongToString( m_aCharz[idxChar].nCount )
			);
			file.WriteString( strChar );
		}

		return( TRUE );
	}
	catch( CFileException* e )
	{
		e->Delete();
		ErrorLog( "ファイル出力", "CWhitespaceDefine::Write()" );
		return( FALSE );
	}
}


/*-----------------------------------------------------------------------------
[名称]	ファイル読み込み
[機能]	空白文字定義をファイルから読み込む。
[戻値]	BOOL 処理結果 [-] (TRUE:成功、FALSE:失敗)
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL	CWhitespaceDefine::Read()
{
	CString		strFilename = CSettingPath::GetInstance()->GetFolderPath() + f_strIniFileName;

	CFileStatus	status;
	BOOL	bExists = CFile::GetStatus( strFilename, status );
	if ( !bExists )
	{
		// ファイル自体が無い
		return( FALSE );
	}

	try
	{
		CStdioFile	file( strFilename, CFile::modeRead | CFile::shareDenyNone );

		BOOL	bSuccess = TRUE;

		// バージョンの読み込み
		CString		strVersion;
		bSuccess = file.ReadString( strVersion );
		if ( !bSuccess )
		{
			return( FALSE );
		}

		// 空白文字定義の読み込み
		m_aCharz.RemoveAll();
		while( TRUE )
		{
			CString	strLine;

			TWhiteSpace		tChar;

			bSuccess &= file.ReadString( strLine );
			tChar.strChar = DeQuoteString( strLine );

			bSuccess &= file.ReadString( strLine );
			tChar.bEnable = StringToBool( strLine );

			bSuccess &= file.ReadString( strLine );
			tChar.bCanContinuation = StringToBool( strLine );

			bSuccess &= file.ReadString( strLine );
			tChar.bCanHead = StringToBool( strLine );

			bSuccess &= file.ReadString( strLine );
			tChar.nCount = StringToLong( strLine );

			if( !bSuccess )
			{
				break;
			}
			m_aCharz.Add( tChar );
		}

		return( TRUE );
	}
	catch( CFileException* e )
	{
		e->Delete();
		// ErrorLog( "ファイル入力", "CWhitespaceDefine::Read()" );
		// ファイルそのものがないという状況を許す
		return( FALSE );
	}
}


/*-----------------------------------------------------------------------------
[名称]	空白文字判定
[機能]	文字列が空白文字かを判定し、空白文字のバイト数を返す。
[戻値]	BOOL 空白文字判定結果 [-] (TRUE:空白文字、FALSE:空白文字でない)
[備考]	空白文字定義を反映する。
-----------------------------------------------------------------------------*/
BOOL	CWhitespaceDefine::IsWhitespace(
	const char* pstrChar,		// I: 判定文字列 [-] (-) :-
	int*		pnByte			// O: 空白文字バイト数 [byte] (-) :-
)
{
	CArray<TWhiteSpace, TWhiteSpace&>*	paWhiteSpacez = GetCharz();
	int		nByte = strlen( pstrChar );

	// タブは常に空白文字とみなす？正規表現で空白文字定義に追加できたほうがよいような please!
	switch( *pstrChar )
	{
	case '\t':
		*pnByte = 1;
		return( TRUE );
		break;

	default:
		break;
	}

	// 空白文字定義を検索して合致するものを探す
	int		idxChar;
	for( idxChar=0 ; idxChar<paWhiteSpacez->GetSize() ; idxChar++ )
	{
		CString	strWhiteSpace = paWhiteSpacez->GetAt( idxChar ).strChar;
		if( paWhiteSpacez->GetAt( idxChar ).bEnable )
		if( nByte >= strWhiteSpace.GetLength() )
		if( 0 == memcmp( pstrChar, strWhiteSpace, strWhiteSpace.GetLength() ) )
		{
			*pnByte = strWhiteSpace.GetLength();
			return( TRUE );
		}
	}
	*pnByte = 0;
	return( FALSE );
}