#include "StdAfx.h"
#include "TextTools.h"

//////////////////////////////////////////////////////////////////////
// ライン切り出し
//////////////////////////////////////////////////////////////////////
int CTextTools::GetLine(CUTF8String &str, CUTF8String &line)
{
	int index = str.Find(_U8("\r\n"));

	if(index == -1)
	{
		if(str.IsEmpty())
			return(0);

		line = str;
		str.Empty();
		return(1);
	}
	
	//	切り出し
	line = str.Left(index);

	//	削除
	str = str.Mid(index + 2);
	return(1);
}

//////////////////////////////////////////////////////////////////////
// トークン切り出し
//////////////////////////////////////////////////////////////////////
int CTextTools::GetToken(CUTF8String &str, CUTF8String &token, CUTF8String div, int trim)
{
	int tlen = div.GetLength();
	int index = str.Find(div);

	if(index == -1)
	{
		if(str.IsEmpty())
			return(0);

		token = str;
		if(trim)
			token.Trim();
		str.Empty();
		return(1);
	}
	
	//	切り出し
	token = str.Left(index);
	if(trim)
		token.Trim();

	//	削除
	str = str.Mid(index + tlen);
	return(1);
}


/*!
	トークン全て切り出し
*/
void CTextTools::GetAllToken(CUTF8String str, CUTF8StringArray &tokens, CUTF8String div, int trim)
{
	tokens.RemoveAll();

	CUTF8String token;
	while(GetToken(str, token, div))
		tokens.Add(token);
}


//////////////////////////////////////////////////////////////
//	ワイルドカード比較
//////////////////////////////////////////////////////////////
/*!
	ワイルドカードで比較

	\return TRUE->一致
*/
int CTextTools::WildCompare(CUTF8String wild, CUTF8String str)
{
	//	前処理
	wild.MakeLower();
	str.MakeLower();

	return(StrMatch(wild, str));
}

/*!
	下請け
*/
int CTextTools::StrMatch(LPCU8STR Ptn, LPCU8STR Str )
{
	switch( *Ptn )
	{
		case '\0':
			return (*Str=='\0');
		case '*':
			return StrMatch( Ptn+1, Str ) || (*Str!='\0') && StrMatch( Ptn, Str+1 );
		case '?':
			return (*Str!='\0') && StrMatch( Ptn+1, Str+1 );
		default:
			return ((unsigned char)*Ptn==(unsigned char)*Str) && StrMatch( Ptn+1, Str+1 );
	}
}


//////////////////////////////////////////////////////////////
//	文字列配列処理
//////////////////////////////////////////////////////////////
/*!
	配列から文字列を検索
*/
int CTextTools::FindStrIndex(CUTF8StringArray &list, CUTF8String find, int noCase)
{
	for(int i=0;i<list.GetCount();i++)
	{
		if(noCase)
		{
			if(list[i].CompareNoCase(find) == 0)
				return(i);
		}
		else
		{
			if(list[i] == find)
				return(i);
		}
	}

	return(-1);
}

//////////////////////////////////////////////////////////////
//	文字列 <-> 数値変換
//////////////////////////////////////////////////////////////
/*!
	文字列を数値に
*/
long CTextTools::StrTol(CUTF8String str, int radix)
{
	return strtol(_cnvMBCS(str), NULL, radix);
}

/*!
	数値を文字列に
*/
CUTF8String CTextTools::ltoStr(long num, int radix)
{
	utf8_char	str[80];

	_ltoa_s(num, (LPSTR)str, 80, radix);
	return(str);
}
