#pragma once

class CTextTools
{
public:

	//////////////////////////////////////////////////////////////
	//	文字列処理（変換）
	//////////////////////////////////////////////////////////////
	//!	書式かされた文字列取得
	static CString GetFormat(LPCTSTR lpszFormat, ...);

	//!	int64へ変換
	static __int64 strtoi64(CString str,int  base);

	//////////////////////////////////////////////////////////////
	//	文字列処理（切り出し）
	//////////////////////////////////////////////////////////////
	//!	行の切り出し
	static int GetLine(CString &str, CString &line);

	//!	トークンの切り出し
	static int GetToken(CString &str, CString &token, CString div, int trim = FALSE);

	//!	トークン全て切り出し
	static void GetAllToken(CString str, CStringArray &tokens, CString div, int trim = FALSE);

	//!	トークンの切り出し(ダブルコーテーションによる文字列に対応)
	static int GetTokenDoubleQuotation(CString &str, CString &token, CString div, int trim = FALSE);

	//!	トークン全て切り出し(ダブルコーテーションによる文字列に対応)
	static void GetAllTokenDoubleQuotation(CString str, CStringArray &tokens, CString div, int trim = FALSE);

	//!	文字列前後のダブルコーテーションを処理
	static CString RemoveDoubleQuotation(CString str);

	//////////////////////////////////////////////////////////////
	//	ワイルドカード比較
	//////////////////////////////////////////////////////////////
	//!	ワイルドカードで比較
	static int WildCompare(CString wild,CString str);

	//////////////////////////////////////////////////////////////
	//	文字列配列処理
	//////////////////////////////////////////////////////////////
	//!	配列から文字列を検索
	static int FindStrIndex(CStringArray &list, CString find, int noCase = 0);

	//////////////////////////////////////////////////////////////
	//	文字列変換
	//////////////////////////////////////////////////////////////
	//!	Unicodeから、ANSI文字列へ
	static CStringA	WideStrToMultiStr(const wchar_t *str);

	//!	MBから、Unicode文字列へ
	static CStringW	MBStrToWideStr(const char *str);

	//!	MBからUTF8へ
	static CStringA	MBStrToUTF8Str(const char *str);

	//!	UTF8からMBへ
	static CStringA	UTF8ToMBStr(const char *str);

	//!	UnicodeからUTF8へ
	static CStringA	WideStrToUTF8Str(const wchar_t *str);

	//!	文字列をUTF8へ
	static CStringA StrToUTF8(CString str);


private:
	//////////////////////////////////////////////////////////////
	//	ワイルドカード比較
	//////////////////////////////////////////////////////////////
	static int StrMatch( const char *Ptn, const char *Str );
};


/*!
	文字列置き換えクラス
*/
class CTextEscape
{
public:
	class CTextEscapeItem
	{
	public:
		CTextEscapeItem() {};
		CTextEscapeItem(CString	token, CString escape)
		{
			m_token = token;
			m_escape = escape;
		};

		CString	m_token;
		CString	m_escape;
	};

	///////////////////////////////////////////////////////////////////////////
	//	文字列のエスケープ
	///////////////////////////////////////////////////////////////////////////
	//!	エスケープの実行
	CString Escape(CString src);

	//!	エスケープの解除
	CString UnEscape(CString escaped);

	//!	追加
	void AddEscape(CString token, CString escape);

	//!	クリア
	void Clear();

protected:
	///////////////////////////////////////////////////////////////////////////
	//	文字列のエスケープ
	///////////////////////////////////////////////////////////////////////////
	//!	一番最初に見つかったインデックスを取得
	int MultiFind(int startIndex, int &findIndex, CString &src, CArray<CTextEscapeItem> &items);

	///////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	///////////////////////////////////////////////////////////////////////////
	//!	置き換え
	CArray<CTextEscapeItem>	m_escape;

	//!	置き換え
	CArray<CTextEscapeItem>	m_unescape;
};