diff -r d59bea55db9b -r c445c931472f src/glpenv06.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/glpenv06.c Mon Dec 06 13:09:21 2010 +0100 @@ -0,0 +1,172 @@ +/* glpenv06.c (standard time) */ + +/*********************************************************************** +* This code is part of GLPK (GNU Linear Programming Kit). +* +* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, +* 2009, 2010 Andrew Makhorin, Department for Applied Informatics, +* Moscow Aviation Institute, Moscow, Russia. All rights reserved. +* E-mail: . +* +* GLPK is free software: you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* GLPK is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +* License for more details. +* +* You should have received a copy of the GNU General Public License +* along with GLPK. If not, see . +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "glpapi.h" + +/*********************************************************************** +* NAME +* +* glp_time - determine current universal time +* +* SYNOPSIS +* +* glp_long glp_time(void); +* +* RETURNS +* +* The routine glp_time returns the current universal time (UTC), in +* milliseconds, elapsed since 00:00:00 GMT January 1, 1970. */ + +static const int epoch = 2440588; /* = jday(1, 1, 1970) */ + +/* POSIX version ******************************************************/ + +#if defined(HAVE_SYS_TIME_H) && defined(HAVE_GETTIMEOFDAY) + +#include +#include + +glp_long glp_time(void) +{ struct timeval tv; + struct tm *tm; + glp_long t; + int j; + gettimeofday(&tv, NULL); + tm = gmtime(&tv.tv_sec); + j = jday(tm->tm_mday, tm->tm_mon + 1, 1900 + tm->tm_year); + xassert(j >= 0); + t = xlset(j - epoch); + t = xlmul(t, xlset(24)); + t = xladd(t, xlset(tm->tm_hour)); + t = xlmul(t, xlset(60)); + t = xladd(t, xlset(tm->tm_min)); + t = xlmul(t, xlset(60)); + t = xladd(t, xlset(tm->tm_sec)); + t = xlmul(t, xlset(1000)); + t = xladd(t, xlset(tv.tv_usec / 1000)); + return t; +} + +/* Windows version ****************************************************/ + +#elif defined(__WOE__) + +#include + +glp_long glp_time(void) +{ SYSTEMTIME st; + glp_long t; + int j; + GetSystemTime(&st); + j = jday(st.wDay, st.wMonth, st.wYear); + xassert(j >= 0); + t = xlset(j - epoch); + t = xlmul(t, xlset(24)); + t = xladd(t, xlset(st.wHour)); + t = xlmul(t, xlset(60)); + t = xladd(t, xlset(st.wMinute)); + t = xlmul(t, xlset(60)); + t = xladd(t, xlset(st.wSecond)); + t = xlmul(t, xlset(1000)); + t = xladd(t, xlset(st.wMilliseconds)); + return t; +} + +/* portable ISO C version *********************************************/ + +#else + +#include + +glp_long glp_time(void) +{ time_t timer; + struct tm *tm; + glp_long t; + int j; + timer = time(NULL); + tm = gmtime(&timer); + j = jday(tm->tm_mday, tm->tm_mon + 1, 1900 + tm->tm_year); + xassert(j >= 0); + t = xlset(j - epoch); + t = xlmul(t, xlset(24)); + t = xladd(t, xlset(tm->tm_hour)); + t = xlmul(t, xlset(60)); + t = xladd(t, xlset(tm->tm_min)); + t = xlmul(t, xlset(60)); + t = xladd(t, xlset(tm->tm_sec)); + t = xlmul(t, xlset(1000)); + return t; +} + +#endif + +/*********************************************************************** +* NAME +* +* glp_difftime - compute difference between two time values +* +* SYNOPSIS +* +* double glp_difftime(glp_long t1, glp_long t0); +* +* RETURNS +* +* The routine glp_difftime returns the difference between two time +* values t1 and t0, expressed in seconds. */ + +double glp_difftime(glp_long t1, glp_long t0) +{ return + xltod(xlsub(t1, t0)) / 1000.0; +} + +/**********************************************************************/ + +#if 0 +int main(void) +{ glp_long t; + glp_ldiv d; + int ttt, ss, mm, hh, day, month, year; + char s[50]; + t = glp_time(); + xprintf("t = %s\n", xltoa(t, s)); + d = xldiv(t, xlset(1000)); + ttt = d.rem.lo, t = d.quot; + d = xldiv(t, xlset(60)); + ss = d.rem.lo, t = d.quot; + d = xldiv(t, xlset(60)); + mm = d.rem.lo, t = d.quot; + d = xldiv(t, xlset(24)); + hh = d.rem.lo, t = d.quot; + xassert(jdate(t.lo + epoch, &day, &month, &year) == 0); + xprintf("%04d-%02d-%02d %02d:%02d:%02d.%03d\n", year, month, day, + hh, mm, ss, ttt); + return 0; +} +#endif + +/* eof */