#include "Gos.pch"
#include "Util.h"


bool	(*GosUtil::Initialize)() = Util::Initialize;
void	(*GosUtil::Shutdown)() = Util::Shutdown;
DWORD	(*GosUtil::LZCompress)( BYTE *dest, BYTE *src, DWORD srcLen ) = Util::LZCompress;
DWORD	(*GosUtil::LZDecompress)( BYTE *dest, BYTE *src, DWORD srcLen ) = Util::LZDecompress;
int		(*GosUtil::Rand)() = Util::Rand;
_int64	(*GosUtil::Time_uS)(bool) = Util::Time_uS;	
DWORD	(*GosUtil::Time_mS)(bool) = Util::Time_mS;	
double	(*GosUtil::Time_S)(bool) = Util::Time_S;	
DWORD	(*GosUtil::GetClipboardText)( TCHAR *, DWORD ) = Util::GetClipboardText;
void	(*GosUtil::SetClipboardText)( TCHAR * ) = Util::SetClipboardText;

_int64 Util::m_tInitializeTick;
double Util::m_rTicksPerSecond;
_int64 Util::m_tTicksPerSecond;
_int64 Util::m_tTicksPerMillisecond;
_int64 Util::m_tTicksPerMicrosecond;



bool Util::Initialize()
{
	m_tInitializeTick = GetCPUCycles();
	Sleep(500);
	_int64 halfSec = GetCPUCycles();
	m_tTicksPerSecond = ( halfSec - m_tInitializeTick ) * 2;
	m_rTicksPerSecond = (double)m_tTicksPerSecond;
	m_tTicksPerMillisecond = m_tTicksPerSecond / 1000;
	m_tTicksPerMicrosecond = m_tTicksPerSecond / 1000000;
	return true;
}

void Util::Shutdown()
{
	;
}

int Util::Rand()
{
	_asm int 3;
	return 0;
}

_int64 Util::Time_uS(bool Clamp)
{
	return (GetCPUCycles()-m_tInitializeTick)/m_tTicksPerMicrosecond;
}

DWORD Util::Time_mS(bool Clamp)
{
	return (DWORD)((GetCPUCycles()-m_tInitializeTick)/m_tTicksPerMillisecond);
}

double Util::Time_S(bool Clamp)
{
	return double(GetCPUCycles()-m_tInitializeTick)/m_rTicksPerSecond;
}

DWORD Util::LZCompress( BYTE *dest, BYTE *src, DWORD srcLen )
{
	/* not implemented, - just copy */
	memcpy( dest, src, srcLen );
	return srcLen;
}

DWORD Util::LZDecompress( BYTE *dest, BYTE *src, DWORD srcLen )
{
	/* not implemented, - just copy */
	memcpy( dest, src, srcLen );
	return srcLen;
}

DWORD Util::GetClipboardText( TCHAR *Dest, DWORD MaxSize )
{
	_asm int 3;
	MaxSize;
	Dest;
	return 0;
}
void Util::SetClipboardText( TCHAR *Text )
{
	_asm int 3;
	Text;
}
