/***
*systime.c - _getsystime and _setsystime
*
*	Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
*
*Purpose:
*	defines _getsystime() and _setsystime()
*
*Revision History:
*	08-22-91  BWM	Wrote module.
*	05-19-92  DJM	ifndef for POSIX build.
*	09-25-92  SKS	Use SetLocalTime(), not SetSystemTime().
*			Fix bug: daylight flag must be initialized to -1.
*			Replace C++ comments with C-style comments
*
*******************************************************************************/

#ifndef _POSIX_

#include <cruntime.h>
#include <oscalls.h>
#include <time.h>

#if !defined(_WIN32_)
#error ERROR - ONLY WIN32 TARGET SUPPORTED!
#endif

/***
*unsigned _getsystime(timestruc, milliseconds) - Get current system time
*
*Purpose:
*
*Entry:
	struct tm * ptm - time structure
*
*Exit:
*	milliseconds of current time
*
*Exceptions:
*
*******************************************************************************/

unsigned _CALLTYPE1 _getsystime(struct tm * ptm)
{
    SYSTEMTIME	st;

    GetLocalTime(&st);

    ptm->tm_isdst	= -1;	/* mktime() computes whether this is */
				/* during Standard or Daylight time. */
    ptm->tm_sec 	= (int)st.wSecond;
    ptm->tm_min 	= (int)st.wMinute;
    ptm->tm_hour	= (int)st.wHour;
    ptm->tm_mday	= (int)st.wDay;
    ptm->tm_mon 	= (int)st.wMonth - 1;
    ptm->tm_year	= (int)st.wYear - 1900;
    ptm->tm_wday	= (int)st.wDayOfWeek;

    /* Normalize uninitialized fields */
    mktime(ptm);

    return (st.wMilliseconds);
}

/***
*unsigned _setsystime(timestruc, milliseconds) - Set new system time
*
*Purpose:
*
*Entry:
*	struct tm * ptm - time structure
*	unsigned milliseconds - milliseconds of current time
*
*Exit:
*	0 if succeeds
*	system error if fails
*
*Exceptions:
*
*******************************************************************************/

unsigned _CALLTYPE1 _setsystime(struct tm * ptm, unsigned uMilliseconds)
{
    SYSTEMTIME	st;

    /* Normalize uninitialized fields */
    mktime(ptm);

    st.wYear		= (WORD)(ptm->tm_year + 1900);
    st.wMonth		= (WORD)(ptm->tm_mon + 1);
    st.wDay		= (WORD)ptm->tm_mday;
    st.wHour		= (WORD)(ptm->tm_hour);
    st.wMinute		= (WORD)ptm->tm_min;
    st.wSecond		= (WORD)ptm->tm_sec;
    st.wMilliseconds	= (WORD)uMilliseconds;

    if (!SetLocalTime(&st)) {
	return ((int)GetLastError());
    }

    return (0);
}

#endif  /* _POSIX_ */
