#include "stdafx.h"
//#include "../global.h"
//#include "../common/common_allinclude.h"
#include "dkutilParser.h"
#include "dkutilString.h"
//#include "dkutilFunction02.h"
//#include "../dktl/dktl_allinclude.h"//dkutilList.h"
//#include "dkutilLoadSave.h"


//#include <boost/spirit/core.hpp>



//using namespace boost::spirit;


namespace dkutil{

namespace private_{

//パースした文字列のタイプをゲットする。
int GetParsedStringType(const char *s)
{
	size_t len = strlen(s);
	if(len==NULL) return -1;//んなヴぁかな事があるのか！
	
	//一文字判定
	if(len==1){
		char tmp = s[0];
		if(0 != isdigit(tmp))
		{//数字だった
			return enuDU2CSV_INT;
		}else
		{//文字らしい
			return enuDU2CSV_STRING;
		}
	}

	//0x 判定 (0xで点を入れてもdoubleにならないよ〜〜ん
	if(s[0] == '0' && s[1] == 'x')
	{
		size_t begin_ = 2;//最初の添え字
		char tmp = s[begin_];//調べる奴
		size_t i;//カウンタ
		size_t num = len - begin_;//数字の数
		//調べるーぷ
		for(i = begin_; i<len;i++)
		{
			if( 0 != isdigit(tmp)){
			}else
			{//文字列らしい
				break;
			}
			//次に調べる文字データをヴちこむ！
			tmp = s[i];
		}
		
		
		if(len - 1 <= i)
		{//やった　これは数字だ！
			//GetStringToIntLengthType cls;
			//16進データを変換･･･（無駄がありすぎ！！
			int itt = atoi(&s[begin_]);
			char lbu[1024];
			NULL_CHAR_ARRAY(lbu);
			_itoa(itt,lbu,10);
			//判定は！？
			int re = GetStringToIntLengthType(lbu);
			switch(re)
			{
			case enuSTRLENGTH_INT_DU:
				return enuDU2CSV_INT;
				break;//おまずぃない
			case enuSTRLENGTH_UINT_DU:
			case enuSTRLENGTH_LONGLONG_DU:
				return enuDU2CSV_LONGLONG;
				break;
			case enuSTRLENGTH_ULONGLONG_DU:
				return enuDU2CSV_ULONGLONG;
				break;
			case 0:
			default:
				break;
			}
		}
		//分からないけど、とりあえずこいつで･･･
		if(i > DCSVSTRUCTURE_DEFAULT_STRING_BUFF_SIZE - 1)
		{//32文字よりでかいよ！
			return enuDU2CSV_STRING_32MORE;
		}
		//やっぱ３２文字以内の何かだよ！
		return enuDU2CSV_STRING;
	}//end of 0x 判定


	//とりあえず、数字だと思うのでこいつで判定
	//GetStringToIntLengthType cls;
	//判定は！？
	int re = GetStringToIntLengthType(s);
	switch(re){
	case enuSTRLENGTH_INT_DU:
		return enuDU2CSV_INT;
		break;//おまずぃない
	case enuSTRLENGTH_UINT_DU:
	case enuSTRLENGTH_LONGLONG_DU:
		return enuDU2CSV_LONGLONG;
		break;
	case enuSTRLENGTH_ULONGLONG_DU:
		return enuDU2CSV_ULONGLONG;
		break;
	case 0:
	default:
		break;
	}





	if(len > DCSVSTRUCTURE_DEFAULT_STRING_BUFF_SIZE)
	{//32文字よりでかいよ！
		return enuDU2CSV_STRING_32MORE;
	}
	//やっぱ３２文字以内の何かだよ！
	return enuDU2CSV_STRING;
}

bool ParsedStringToGeneralPurposeVariable(const char *s,GeneralPurposeVariable *v)
{
	radix_convert conv;
	GeneralPurposeVariable &data =(*v);
	int r=GetParsedStringType( s );
	switch(r)
	{
	case enuDU2CSV_STRING:
	case enuDU2CSV_STRING_32MORE:
		data.insert(s);
		break;
	case enuDU2CSV_DOUBLE:
		//DOUBLE（浮動小数点)だった
		data.insert( ::atof( s ) );
		break;
	case enuDU2CSV_INT:
		{//INTだった
			if(private_::is0x(s)){
				data.insert(  conv.a16toi(s) );
			}else{
				data.insert(  ::atoi(s) );
			}
			break;
		}
	case enuDU2CSV_LONGLONG:
		{//LONGLONGだった
			if(private_::is0x(s)){
				data.insert( conv.a16toll(s) );
			}else{
				data.insert( ::_atoi64(s) );
			}
			break;
		}
	case enuDU2CSV_ULONGLONG:
		{//ULONGLONGだった
			if(private_::is0x(s)){
				data.insert( conv.a16toull( s ) );
			}else{
				data.insert( atoull( s ) );
			}
			break;
		}
	default:
		return false;
	}//end of switch
	return true;
}

}//end of private_ namespace


}//end of namespace