/*
 * msvcrt.dll date/time functions
 *
 * Copyright 1996,1998 Marcus Meissner
 * Copyright 1996 Jukka Iivonen
 * Copyright 1997,2000 Uwe Bonnes
 * Copyright 2000 Jon Griffiths
 */
#include <time.h>
#include <sys/times.h>
#include "msvcrt.h"

DEFAULT_DEBUG_CHANNEL(msvcrt);

typedef struct __MSVCRT_timeb
{
  time_t  time;
  unsigned short  millitm;
  short   timezone;
  short   dstflag;
} MSVCRT_timeb;


/* INTERNAL: Return formatted current time/date */
char * MSVCRT_get_current_time(char * out, const char * format)
{
  static const time_t bad_time = (time_t)-1;
  time_t t;
  struct tm *_tm = NULL;
  char *retval = NULL;

  if (time(&t) != bad_time && (_tm = localtime(&t)) &&
      strftime(out,9,format,_tm) == 8)
    retval = out;
  if (_tm)
    MSVCRT_free(_tm);
  return retval;
}

/**********************************************************************
 *		_strdate (MSVCRT.@)
 */
char * __cdecl MSVCRT__strdate (char * date)
{
  return MSVCRT_get_current_time(date,"%m/%d/%y");
}

/*********************************************************************
 *		_strtime (MSVCRT.@)
 */
char * __cdecl MSVCRT__strtime (char * date)
{
  return MSVCRT_get_current_time(date,"%H:%M:%S");
}

/*********************************************************************
 *		clock (MSVCRT.@)
 */
clock_t __cdecl MSVCRT_clock(void)
{
  struct tms alltimes;
  clock_t res;

  times(&alltimes);
  res = alltimes.tms_utime + alltimes.tms_stime +
        alltimes.tms_cutime + alltimes.tms_cstime;
  /* FIXME: We need some symbolic representation for CLOCKS_PER_SEC,
   *  10 holds only for Windows/Linux_i86)
   */
  return 10*res;
}

/*********************************************************************
 *		difftime (MSVCRT.@)
 */
double __cdecl MSVCRT_difftime (time_t time1, time_t time2)
{
    return (double)(time1 - time2);
}

/*********************************************************************
 *		time (MSVCRT.@)
 */
time_t __cdecl MSVCRT_time(time_t *buf)
{
  time_t curtime = time(NULL);
  return buf ? *buf = curtime : curtime;
}

/*********************************************************************
 *		_ftime (MSVCRT.@)
 */
void __cdecl MSVCRT__ftime (MSVCRT_timeb *buf)
{
  buf->time = MSVCRT_time(NULL);
  buf->millitm = 0; /* FIXME */
  buf->timezone = 0;
  buf->dstflag = 0;
}
