enhanced qse_timegm() further
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: syscall.h 97 2009-03-10 10:39:18Z hyunghwan.chung $
|
||||
* $Id: syscall.h 187 2009-06-07 05:03:44Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
|
||||
@ -36,6 +36,12 @@
|
||||
#ifdef HAVE_ERRNO_H
|
||||
# include <errno.h>
|
||||
#endif
|
||||
#ifdef HAVE_TIME_H
|
||||
# include <time.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
# include <sys/time.h>
|
||||
#endif
|
||||
|
||||
#if defined(QSE_USE_SYSCALL) && defined(HAVE_SYS_SYSCALL_H)
|
||||
# include <sys/syscall.h>
|
||||
@ -189,4 +195,17 @@
|
||||
# define QSE_cHROOT(path) chroot(path)
|
||||
#endif
|
||||
|
||||
#ifdef SYS_gettimeofday
|
||||
# define QSE_GETTIMEOFDAY(tv,tz) syscall(SYS_gettimeofday, tv, tz)
|
||||
#else
|
||||
# define QSE_GETTIMEOFDAY(tv,tz) gettimeofday(tv,tz)
|
||||
#endif
|
||||
|
||||
#ifdef SYS_settimeofday
|
||||
# define QSE_SETTIMEOFDAY(tv,tz) syscall(SYS_settimeofday, tv, tz)
|
||||
#else
|
||||
# define QSE_SETTIMEOFDAY(tv,tz) settimeofday(tv,tz)
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: time.c 186 2009-06-06 13:42:57Z hyunghwan.chung $
|
||||
* $Id: time.c 187 2009-06-07 05:03:44Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
|
||||
@ -52,14 +52,23 @@ static const int mdays_tot[2][QSE_MONS_PER_YEAR] =
|
||||
{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }
|
||||
};
|
||||
|
||||
/* number of days from the beginning of the year to the end of of
|
||||
* a previous month. adjust for leap years in the code. */
|
||||
/* number of days from beginning of a previous month to the end of
|
||||
* the year. adjust for leap years in the code. */
|
||||
static const int mdays_rtot[2][QSE_MONS_PER_YEAR] =
|
||||
{
|
||||
{ 334, 306, 275, 245, 214, 184, 153, 122, 92, 61, 31, 0 },
|
||||
{ 335, 306, 275, 245, 214, 184, 153, 122, 92, 61, 31, 0 }
|
||||
};
|
||||
|
||||
/* get number of extra days for leap years between fy and ty inclusive */
|
||||
static int get_leap_days (int fy, int ty)
|
||||
{
|
||||
fy--; ty--;
|
||||
return (ty / 4 - fy / 4) -
|
||||
(ty / 100 - fy / 100) +
|
||||
(ty / 400 - fy / 400);
|
||||
}
|
||||
|
||||
int qse_gettime (qse_ntime_t* t)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
@ -80,11 +89,7 @@ int qse_gettime (qse_ntime_t* t)
|
||||
struct timeval tv;
|
||||
int n;
|
||||
|
||||
#ifdef SYS_gettimeofday
|
||||
n = syscall (SYS_gettimeofday, &tv, QSE_NULL);
|
||||
#else
|
||||
n = gettimeofday (&tv, QSE_NULL);
|
||||
#endif
|
||||
n = QSE_GETTIMEOFDAY (&tv, QSE_NULL);
|
||||
if (n == -1) return -1;
|
||||
|
||||
*t = (qse_ntime_t)tv.tv_sec*QSE_MSECS_PER_SEC +
|
||||
@ -112,24 +117,16 @@ int qse_settime (qse_ntime_t t)
|
||||
|
||||
/*
|
||||
#if defined CLOCK_REALTIME && HAVE_CLOCK_SETTIME
|
||||
{
|
||||
int r = clock_settime (CLOCK_REALTIME, ts);
|
||||
if (r == 0 || errno == EPERM)
|
||||
return r;
|
||||
}
|
||||
{
|
||||
int r = clock_settime (CLOCK_REALTIME, ts);
|
||||
if (r == 0 || errno == EPERM)
|
||||
return r;
|
||||
}
|
||||
#elif HAVE_STIME
|
||||
/ * This fails to compile on OSF1 V5.1, due to stime requiring
|
||||
a `long int*' and tv_sec is `int'. But that system does provide
|
||||
settimeofday. * /
|
||||
return stime (&ts->tv_sec);
|
||||
return stime (&ts->tv_sec);
|
||||
#else
|
||||
*/
|
||||
|
||||
#ifdef SYS_settimeofday
|
||||
n = syscall (SYS_settimeofday, &tv, QSE_NULL);
|
||||
#else
|
||||
n = settimeofday (&tv, QSE_NULL);
|
||||
#endif
|
||||
n = QSE_SETTIMEOFDAY (&tv, QSE_NULL);
|
||||
if (n == -1) return -1;
|
||||
return 0;
|
||||
#endif
|
||||
@ -294,14 +291,20 @@ int qse_timegm (const qse_btime_t* bt, qse_ntime_t* nt)
|
||||
int y = bt->year + QSE_BTIME_YEAR_BASE;
|
||||
int midx = QSE_IS_LEAPYEAR(y)? 1: 0;
|
||||
|
||||
QSE_ASSERT (bt->mon >= 0 && bt->mon < QSE_MONS_PER_YEAR);
|
||||
|
||||
if (y < QSE_EPOCH_YEAR)
|
||||
{
|
||||
int x;
|
||||
|
||||
for (x = y; x < QSE_EPOCH_YEAR - 1; x++)
|
||||
n += QSE_DAYS_PER_YEAR(x);
|
||||
for (x = bt->mon + 1; x < QSE_MONS_PER_YEAR; x++)
|
||||
n += mdays[midx][x];
|
||||
/*for (x = y; x < QSE_EPOCH_YEAR - 1; x++)
|
||||
n += QSE_DAYS_PER_YEAR(x);*/
|
||||
n = QSE_DAYS_PER_NORMYEAR * (QSE_EPOCH_YEAR - 1 - y) +
|
||||
get_leap_days (y, QSE_EPOCH_YEAR - 1);
|
||||
|
||||
/*for (x = bt->mon + 1; x < QSE_MONS_PER_YEAR; x++)
|
||||
n += mdays[midx][x];*/
|
||||
n += mdays_rtot[midx][bt->mon];
|
||||
|
||||
n += mdays[midx][bt->mon] - bt->mday;
|
||||
if (midx == 1) n -= 1;
|
||||
@ -318,8 +321,10 @@ int qse_timegm (const qse_btime_t* bt, qse_ntime_t* nt)
|
||||
{
|
||||
int x;
|
||||
|
||||
for (x = QSE_EPOCH_YEAR; x < y; x++)
|
||||
n += QSE_DAYS_PER_YEAR(x);
|
||||
/*for (x = QSE_EPOCH_YEAR; x < y; x++)
|
||||
n += QSE_DAYS_PER_YEAR(x);*/
|
||||
n = QSE_DAYS_PER_NORMYEAR * (y - QSE_EPOCH_YEAR) +
|
||||
get_leap_days (QSE_EPOCH_YEAR, y);
|
||||
|
||||
/*for (x = 0; x < bt->mon; x++) n += mdays[midx][x];*/
|
||||
n += mdays_tot[midx][bt->mon];
|
||||
|
@ -64,7 +64,7 @@ void qse_lsp_seterror (
|
||||
{
|
||||
case 0:
|
||||
lsp->prmfns.misc.sprintf (
|
||||
lsp->prmfns.misc.data,
|
||||
lsp->prmfns.misc.udd,
|
||||
lsp->errmsg,
|
||||
QSE_COUNTOF(lsp->errmsg),
|
||||
errfmt);
|
||||
@ -72,7 +72,7 @@ void qse_lsp_seterror (
|
||||
|
||||
case 1:
|
||||
lsp->prmfns.misc.sprintf (
|
||||
lsp->prmfns.misc.data,
|
||||
lsp->prmfns.misc.udd,
|
||||
lsp->errmsg,
|
||||
QSE_COUNTOF(lsp->errmsg),
|
||||
errfmt,
|
||||
@ -81,7 +81,7 @@ void qse_lsp_seterror (
|
||||
|
||||
case 2:
|
||||
lsp->prmfns.misc.sprintf (
|
||||
lsp->prmfns.misc.data,
|
||||
lsp->prmfns.misc.udd,
|
||||
lsp->errmsg,
|
||||
QSE_COUNTOF(lsp->errmsg),
|
||||
errfmt,
|
||||
@ -91,7 +91,7 @@ void qse_lsp_seterror (
|
||||
|
||||
case 3:
|
||||
lsp->prmfns.misc.sprintf (
|
||||
lsp->prmfns.misc.data,
|
||||
lsp->prmfns.misc.udd,
|
||||
lsp->errmsg,
|
||||
QSE_COUNTOF(lsp->errmsg),
|
||||
errfmt,
|
||||
@ -102,7 +102,7 @@ void qse_lsp_seterror (
|
||||
|
||||
case 4:
|
||||
lsp->prmfns.misc.sprintf (
|
||||
lsp->prmfns.misc.data,
|
||||
lsp->prmfns.misc.udd,
|
||||
lsp->errmsg,
|
||||
QSE_COUNTOF(lsp->errmsg),
|
||||
errfmt,
|
||||
@ -114,7 +114,7 @@ void qse_lsp_seterror (
|
||||
|
||||
case 5:
|
||||
lsp->prmfns.misc.sprintf (
|
||||
lsp->prmfns.misc.data,
|
||||
lsp->prmfns.misc.udd,
|
||||
lsp->errmsg,
|
||||
QSE_COUNTOF(lsp->errmsg),
|
||||
errfmt,
|
||||
|
@ -34,7 +34,7 @@ qse_lsp_t* qse_lsp_open (
|
||||
lsp = (qse_lsp_t*) malloc (QSE_SIZEOF(qse_lsp_t));
|
||||
#else
|
||||
lsp = (qse_lsp_t*) prmfns->mmgr.alloc (
|
||||
prmfns->mmgr.data, QSE_SIZEOF(qse_lsp_t));
|
||||
prmfns->mmgr.udd, QSE_SIZEOF(qse_lsp_t));
|
||||
#endif
|
||||
if (lsp == QSE_NULL) return QSE_NULL;
|
||||
|
||||
|
@ -45,22 +45,22 @@ static int __print (qse_lsp_t* lsp, const qse_lsp_obj_t* obj, qse_bool_t prt_con
|
||||
case QSE_LSP_OBJ_INT:
|
||||
#if QSE_SIZEOF_LONG_LONG > 0
|
||||
lsp->prmfns.misc.sprintf (
|
||||
lsp->prmfns.misc.data,
|
||||
lsp->prmfns.misc.udd,
|
||||
buf, QSE_COUNTOF(buf),
|
||||
QSE_T("%lld"), (long long)QSE_LSP_IVAL(obj));
|
||||
#elif QSE_SIZEOF___INT64 > 0
|
||||
lsp->prmfns.misc.sprintf (
|
||||
lsp->prmfns.misc.data,
|
||||
lsp->prmfns.misc.udd,
|
||||
buf, QSE_COUNTOF(buf),
|
||||
QSE_T("%I64d"), (__int64)QSE_LSP_IVAL(obj));
|
||||
#elif QSE_SIZEOF_LONG > 0
|
||||
lsp->prmfns.misc.sprintf (
|
||||
lsp->prmfns.misc.data,
|
||||
lsp->prmfns.misc.udd,
|
||||
buf, QSE_COUNTOF(buf),
|
||||
QSE_T("%ld"), (long)QSE_LSP_IVAL(obj));
|
||||
#elif QSE_SIZEOF_INT > 0
|
||||
lsp->prmfns.misc.sprintf (
|
||||
lsp->prmfns.misc.data,
|
||||
lsp->prmfns.misc.udd,
|
||||
buf, QSE_COUNTOF(buf),
|
||||
QSE_T("%d"), (int)QSE_LSP_IVAL(obj));
|
||||
#else
|
||||
@ -71,7 +71,7 @@ static int __print (qse_lsp_t* lsp, const qse_lsp_obj_t* obj, qse_bool_t prt_con
|
||||
|
||||
case QSE_LSP_OBJ_REAL:
|
||||
lsp->prmfns.misc.sprintf (
|
||||
lsp->prmfns.misc.data,
|
||||
lsp->prmfns.misc.udd,
|
||||
buf, QSE_COUNTOF(buf),
|
||||
QSE_T("%Lf"),
|
||||
#ifdef __MINGW32__
|
||||
@ -141,7 +141,7 @@ static int __print (qse_lsp_t* lsp, const qse_lsp_obj_t* obj, qse_bool_t prt_con
|
||||
|
||||
default:
|
||||
lsp->prmfns.misc.sprintf (
|
||||
lsp->prmfns.misc.data,
|
||||
lsp->prmfns.misc.udd,
|
||||
buf, QSE_COUNTOF(buf),
|
||||
QSE_T("unknown object type: %d"), QSE_LSP_TYPE(obj));
|
||||
OUTPUT_STR (lsp, buf);
|
||||
|
Reference in New Issue
Block a user