enhanced qse_timegm() further

This commit is contained in:
2009-06-07 23:03:44 +00:00
parent 08c1d422f3
commit 3ac15453b1
12 changed files with 101 additions and 55 deletions

View File

@ -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

View File

@ -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];

View File

@ -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,

View File

@ -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;

View File

@ -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);