////////////////////////////////////////////////////////////////////////////
// CLangConfig クラスのインプリメンテーション
//
////////////////////////////////////////////////////////////////////////////

#include "LangConfig.h"
#include "TxtColorMgr.h"
#include "cpp/TxtColorMgr_cpp.h"
#include "java/TxtColorMgr_java.h"
#include "cobol/TxtColorMgr_cbl.h"
#include "js/TxtColorMgr_js.h"
#include "vbs/TxtColorMgr_vbs.h"
#include "cs/TxtColorMgr_cs.h"
#include "txt/TxtColorMgr_txt.h"

using namespace NLangExt;

////////////////////////////////////////////////////////////////////////////
// 構築/破棄
////////////////////////////////////////////////////////////////////////////

CLangConfig::CLangConfig( VClsPtr< CConfigInfo > pConf )
{
	StoreExtTypeInfo( pConf->RefCPP_FileExt(), LANGTYPE_CPP );
	StoreExtTypeInfo( pConf->RefJAVA_FileExt(), LANGTYPE_JAVA );
	StoreExtTypeInfo( pConf->RefCOBOL_FileExt(), LANGTYPE_CBL );
	StoreExtTypeInfo( pConf->RefJS_FileExt(), LANGTYPE_JS );
	StoreExtTypeInfo( pConf->RefVBS_FileExt(), LANGTYPE_VBS );
	StoreExtTypeInfo( pConf->RefCS_FileExt(), LANGTYPE_CS );
}

CLangConfig::~CLangConfig()
{

}

////////////////////////////////////////////////////////////////////////////
// メソッド
////////////////////////////////////////////////////////////////////////////

// ファイル名に対応した言語種類コードを取得
enumLANGTYPE CLangConfig::GetLangTypeID( const char* FileName ) const
{
	string ext = GetExt( FileName );
	map < string, enumLANGTYPE >::const_iterator itr = mapExtTypeInfo.find( ext );

	// 該当する拡張子が見つからない場合は、通常のテキストファイルと見なす
	if ( mapExtTypeInfo.end() == itr )
		return LANGTYPE_TEXT;
	return itr->second;
}

// 色管理オブジェクトを構築
CTxtColorMgr* CLangConfig::CreateColorMgr( enumLANGTYPE type ) const
{
	switch ( type ) {
	case LANGTYPE_CPP:	// C/C++
		return new NLangExt_cpp::CTxtColorMgr_cpp();
	case LANGTYPE_JAVA:	// Java
		return new NLangExt_java::CTxtColorMgr_java();
	case LANGTYPE_CBL:	// Cobol
		return new NLangExt_cbl::CTxtColorMgr_cbl();
	case LANGTYPE_JS:	// JavaScript
		return new NLangExt_js::CTxtColorMgr_js();
	case LANGTYPE_VBS:	// VBScript
		return new NLangExt_vbs::CTxtColorMgr_vbs();
	case LANGTYPE_CS:	// C#
		return new NLangExt_cs::CTxtColorMgr_cs();
	default:
		return new NLangExt_txt::CTxtColorMgr_txt();
	}
}

// ファイル名の拡張子を取得
string CLangConfig::GetExt( const char* fname ) const
{
	int i = strlen( fname );
	if ( i <= 0 ) return "";
	for ( --i; i >= 0 && fname[i] != '.' && fname[i] != '/'; --i );
	if ( i >= 0 && fname[i] == '.' )
		return fname + i + 1;
	else
		return "";
}

// CConfigInfoから取得した情報を、mapExtTypeInfoに格納する
void CLangConfig::StoreExtTypeInfo( const string& ExtInfo, enumLANGTYPE n )
{
	int i = 0;
	int j;
	while ( i < ExtInfo.length() ) {
		for ( j = i; j < ExtInfo.length() && ExtInfo[j] != ','; j++ );
		mapExtTypeInfo.insert( pair< string, enumLANGTYPE >( ExtInfo.substr( i, j - i ), n ) );
		i = j + 1;
	}
}

// 言語名から言語種別を取得
enumLANGTYPE NLangExt::GetLangTypeID_ByLangName( const char *LangName )
{
	// 言語名と言語種別の組
	const char *pLangName[] = {
		"Text", "C", "Java", "Cobol", "JS", "VBS", "CS"
	};
	enum enumLANGTYPE vLangType[] = {
		LANGTYPE_TEXT, LANGTYPE_CPP, LANGTYPE_JAVA, LANGTYPE_CBL,
		LANGTYPE_JS, LANGTYPE_VBS, LANGTYPE_CS
	};
	int cnt = sizeof( pLangName ) / sizeof( pLangName[0] );
	int i;

	// 検索
	for ( i = 0; i < cnt && strcasecmp( LangName, pLangName[i] ); i++ );
	if ( i >= cnt )
		return LANGTYPE_TEXT;
	else
		return vLangType[i];
}

