#include "stdafx.h"
#include "dkutilString.h"

namespace dkutil{


namespace private_{

int GetStringToIntLengthTypeBase::operator ()(const char *s)
{

	size_type size= strlen(s);
	

	{//アホ値検索（BM法使うか！？（いや使えねぇ･･･)
		//bool isSTR_ = false;
		for(size_type i=0;i<size;i++)
		{
			if(!isDigit(s[i]))
			{//ヴぁかもん
				if(s[i] == '.')
				{//こいつぁ〜　どヴる（double)しかねぇ！
					return enuSTRLENGTH_DOUBLE;
				}
				return -1;
			}
		}
	}

	//bool finished = false;//まだ処理が終わってないよフラ具（おいしそうな具だなぁ(爆))
	int result = 0;
	if(strulonglong < size)
	{//いやいや無理だよ^^;
		return -1;
	}
	//VC依存なのかな〜？
	size_type num = ::atoi(s);

#		define GOTOEND() if(result){ goto end;}

	//intで大丈夫か？
	if(strint >= size){
		if(!(num >= INT_MAX)){
			result = enuSTRLENGTH_INT_DU;
		}
	}
	GOTOEND();

	//uintで大丈夫か？
	if(struint >= size){
		if(!(num >= UINT_MAX)){
			result = enuSTRLENGTH_UINT_DU;
		}
	}
	//GOTOEND();

	//longlongで大丈夫か？
	if(strlonglong >= size){
		if(!(num >= LONGLONG_MAX)){
			result = enuSTRLENGTH_INT_DU;
		}
	}
	//GOTOEND();

	//ulonglong でだいぞーぶか？
	if(strulonglong >= size){
		if(!(num >= ULONGLONG_MAX)){
			result = enuSTRLENGTH_INT_DU;
		}
	}
#	undef GOTOEND
end:
	return result;

}


}//end of private namespace

int GetStringToIntLengthType(const char *s){
	static private_::GetStringToIntLengthTypeBase f;
	return f(s);
}



//もっと見やすく出来ないかな〜〜（メッちゃきたねぇソースだし！
bool isBigStrNum(char *src,char *str)
{
	
	//アホらしい　エラーチェック。
	//こいつのチェックで処理の半分以上はかかっているような気が･･･
	//GetStringToIntLengthType cls;
	//if(!isStringDigit(src)) return false;
	//if(!isStringDigit(str)) return false;
	
	//int srclen_ = strlen(src);
	//int strlen_ = strlen(str);

	double srcnumd = 0;
	LONGLONG srcnum = 0;
	double strnumd = 0;
	LONGLONG strnum = 0;

	int r;
	//**********************************************************
	//srcのチェック
	r = GetStringToIntLengthType(src);

	if(r == 0)
	{//アホ値は　しけー
		goto THROW_END;
	}


	if(r==enuSTRLENGTH_DOUBLE){
		srcnumd = ::atof(src);
	}else{
		//スマソ･･･　_atoi64だめだったらatoiにでも･･･
		LONGLONG srcnum = ::_atoi64(src);
	}
	//**********************************************************
	//strのチェック

	r = GetStringToIntLengthType(str);
	if(r == 0){
		goto THROW_END;
	}

	if(r == enuSTRLENGTH_DOUBLE){
		strnumd = ::atof(str);
	}else{ 
		strnum = ::_atoi64(str);
	}

	if(srcnum != 0 && strnum != 0)
	{//LONGLONGで比較
		if(srcnum > strnum){
			return true;
		}else{
			return false;
		}

	}else if(srcnumd != 0 && strnumd != 0)
	{//DOUBLEで比較
		if(srcnumd > strnumd){
			return true;
		}else{
			return false;
		}
	}else
	{//DOUBLEを強制キャストして　LONGLONGで比較
		LONGLONG cm1;
		LONGLONG cm2;
		if(srcnum != 0){
			cm1 = srcnum;
		}else{
			cm1 =(LONGLONG) srcnumd;
		}

		if(strnum != 0){
			cm2 = strnum;
		}else{
			cm2 = (LONGLONG)strnumd;
		}
		if(cm1 > cm2){
			return true;
		}else{
			return false;
		}

		goto THROW_END;
	}
THROW_END:
	throw std::invalid_argument("数字以外の文字列入れてるかも！");
	return false;
}




}//end of include once
