//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
// 
// Unmanaged.cpp : Definiuje punkt wejścia dla aplikacji DLL.
//

#include "stdafx.h"
#include "Unmanaged.h"
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
    return TRUE;
}
UNMANAGED_API void DateFunction(DATE date, wchar_t *retBuffer, int bufferLength)
{
	SYSTEMTIME st;
	VariantTimeToSystemTime(date, &st);
	int retVal = GetDateFormat(LOCALE_USER_DEFAULT,
		                       DATE_LONGDATE,
							   &st,
							   NULL,
							   retBuffer,
							   bufferLength);
	return;
}
UNMANAGED_API int StringFunction(LPCTSTR str)
{
	return (int)_tcslen(str);
}
// UNMANAGED_API BSTR Add(LPCSTR a, LPCSTR b)
UNMANAGED_API LPSTR Add(LPCSTR a, LPCSTR b)
{
	size_t size = strlen(a) + strlen(b) + 1;
	char* buffer = new char[size];
	strcpy(buffer, a);
	strcat(buffer, b);
//	return SysAllocString(L"Witaj!");
	return buffer;
}
UNMANAGED_API complex ComplexAdd(complex a, complex b)
{
	complex c;
	c.re = a.re + b.re;
	c.im = a.im + b.im;
	return c;
}

UNMANAGED_API int IntArrayFunction(int *pia, int length)
{
	int max = pia[0];
	for(int i = 0;i < length; i++)
		if(pia[i] > max)
			max = pia[i];
	return max;
}
UNMANAGED_API float FloatArrayFunction(float *pfa, int length)
{
	float max = pfa[0];
	for(int i = 0;i < length; i++)
		if(pfa[i] > max)
			max = pfa[i];
	return max;
}
UNMANAGED_API void CurrencyFunction(CURRENCY cur, CURRENCY *d)
{
	*d = cur;
}
UNMANAGED_API int OutFunction(int i, int *r)
{
	*r = i  * 2;
	return i;
}

UNMANAGED_API int Average( int first, ... )
{
   int count = 0, sum = 0, i = first;
   va_list marker;

   va_start( marker, first ); 
   while( i != -1 )
   {
      sum += i;
      count++;
      i = va_arg( marker, int);
   }
   va_end( marker );
   return( sum ? (sum / count) : 0 );
}

UNMANAGED_API VARIANT VariantFunction(VARIANT var)
{
	return var;
}
