/*!
@brief DLL管理機構
*/
#define DKUTIL_DLL_CPP
#ifdef _MSC_VER
#	pragma once
#endif

#include <dkutil/dll.hpp>
#include <dkutil/parser/radix_convert.hpp>
#include <dkutil/parser/char_util.hpp>

namespace dkutil{

bool DLLManager::GetDLLFileVersion(const char *name,DLLVersion *dll)
{
	VersionInfo v;
	char buff[1024]="";

	if(false==v.GetInfo(name,buff,sizeof(buff),"FILEVERSION"))
	{
		return false;
	}
	VS_FIXEDFILEINFO viif={0};
	v.GetFileInfo(name,&viif);
	size_t len = strlen(buff);
	{
		//バージョン文字列をパーシング
		const char bn = 4;
		char b[bn][32];
		{for(int i=0;i<bn;i++){
			memset(b[i],0,sizeof(b[i]));
		}}

		int co = 0;

		offset_pusher<char> p(b[co],sizeof(b[co]) - 1);
		for(size_t i=0;i<len;i++)
		{
			if(buff[i] == ',' || buff[i] == '.')
			{
				co ++;
				// 第二引数が　-1　なのは、NULL文字考慮のため
				p.reset(b[co],sizeof(b[co]) - 1);
				continue;
			}
			p.push_back(&buff[i],sizeof(char));
		}
		
		//バージョンをint値にして格納
		{
			int vb[bn];
			memset(vb,0,sizeof(vb));
			radix_convert conv;
			int *target = vb;
			for(int i=0;i<bn;i++)
			{
				bool isHEX = false;
				{
					size_t se = strlen(b[i]);
					int c;
					for(size_t j=0;j<se;j++){
						c = b[i][j];
						if(('A' <= c && c <= 'F') || ('a' <= c && c <= 'f')){
							isHEX = true;
							break;
						}else if(isAlpha(c))
						{//16進法じゃないみたいだから、これは数字化できないよん！
							return false;
						}
					}
				}
				if(isHEX){
					(*target) = conv.a16toi(b[i]);
				}else{
					(*target) = ::atoi(b[i]);
				}
				target++;
			}
			dll->v1 = vb[0];
			dll->v2 = vb[1];
			dll->v3 = vb[2];
			dll->v4 = vb[3];
		}
	
	}
	return true;
}

}//end of namespace





