partially implemented qse_gmtime()

- still need to enhance to support msec in the broken-down time
This commit is contained in:
2008-12-22 08:31:30 +00:00
parent 7fe07c5ca4
commit 311e3bf4e7
3 changed files with 101 additions and 51 deletions

View File

@ -1061,7 +1061,7 @@ static int bfn_systime (qse_awk_run_t* run, const qse_char_t* fnm, qse_size_t fn
if (qse_gettime(&now) == -1)
r = qse_awk_makeintval (run, QSE_TYPE_MIN(qse_long_t));
else
r = qse_awk_makeintval (run, now / QSE_MSEC_IN_SEC);
r = qse_awk_makeintval (run, now / QSE_MSECS_PER_SEC);
if (r == QSE_NULL)
{
@ -1073,6 +1073,18 @@ static int bfn_systime (qse_awk_run_t* run, const qse_char_t* fnm, qse_size_t fn
return 0;
}
static int bfn_gmtime (qse_awk_run_t* run, const qse_char_t* fnm, qse-size_t fnl)
{
qse_ntime_t nt;
qse_btime_t bt;
qse_gmtime (nt, &bt);
/* TODO: create an array containing
* .....
*/
}
#define ADD_FUNC(awk,name,min,max,bfn) \
if (qse_awk_addfunc (\
(awk), (name), qse_strlen(name), \
@ -1092,6 +1104,7 @@ static int add_functions (qse_awk_t* awk)
ADD_FUNC (awk, QSE_T("rand"), 0, 0, bfn_rand);
ADD_FUNC (awk, QSE_T("srand"), 0, 1, bfn_srand);
ADD_FUNC (awk, QSE_T("systime"), 0, 0, bfn_systime);
ADD_FUNC (awk, QSE_T("gmtime"), 0, 0, bfn_gmtime);
/*
ADD_FUNC (awk, QSE_T("strftime"), 0, 2, bfn_strftime);
ADD_FUNC (awk, QSE_T("strfgmtime"), 0, 2, bfn_strfgmtime);

View File

@ -23,10 +23,10 @@
#define EPOCH_DIFF_YEARS (QSE_EPOCH_YEAR-WIN_EPOCH_YEAR)
#define EPOCH_DIFF_DAYS (EPOCH_DIFF_YEARS*365+EPOCH_DIFF_YEARS/4-3)
#define EPOCH_DIFF_SECS (EPOCH_DIFF_DAYS*24*60*60)
#define EPOCH_DIFF_MSECS (EPOCH_DIFF_SECS*QSE_MSEC_IN_SEC)
#define EPOCH_DIFF_MSECS (EPOCH_DIFF_SECS*QSE_MSECS_PER_SEC)
#endif
static int mdays[2][QSE_MON_IN_YEAR] =
static int mdays[2][QSE_MONS_PER_YEAR] =
{
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
@ -59,7 +59,8 @@ int qse_gettime (qse_ntime_t* t)
#endif
if (n == -1) return -1;
*t = tv.tv_sec * QSE_MSEC_IN_SEC + tv.tv_usec / QSE_USEC_IN_MSEC;
*t = (qse_ntime_t)tv.tv_sec*QSE_MSECS_PER_SEC +
(qse_ntime_t)tv.tv_usec/QSE_USECS_PER_MSEC;
return 0;
#endif
}
@ -78,8 +79,8 @@ int qse_settime (qse_ntime_t t)
struct timeval tv;
int n;
tv.tv_sec = t / QSE_MSEC_IN_SEC;
tv.tv_usec = (t % QSE_MSEC_IN_SEC) * QSE_USEC_IN_MSEC;
tv.tv_sec = t / QSE_MSECS_PER_SEC;
tv.tv_usec = (t % QSE_MSECS_PER_SEC) * QSE_USECS_PER_MSEC;
/*
#if defined CLOCK_REALTIME && HAVE_CLOCK_SETTIME
@ -106,42 +107,74 @@ int qse_settime (qse_ntime_t t)
#endif
}
void qse_gmtime (qse_ntime_t nt, qse_btime_t* bt)
static void brkdntime (qse_ntime_t nt, qse_btime_t* bt, qse_ntime_t offset)
{
/* code based on minix 2.0 src/lib/ansi/gmtime.c */
int midx;
qse_ntime_t days; /* total days */
qse_ntime_t secs; /* number of seconds in the fractional days */
qse_ntime_t time; /* total seconds */
int year = QSE_EPOCH_YEAR;
qse_ntime_t secs; /* the remaining seconds */
qse_ntime_t year = QSE_EPOCH_YEAR;
time = nt / QSE_MSEC_IN_SEC;
days = (unsigned long)time / QSE_SEC_IN_DAY;
secs = (unsigned long)time % QSE_SEC_IN_DAY;
bt->sec = secs % QSE_SEC_IN_MIN;
bt->min = (secs % QSE_SEC_IN_HOUR) / QSE_SEC_IN_MIN;
bt->hour = secs / QSE_SEC_IN_HOUR;
nt += offset;
/* TODO: support bt->msecs */
/*bt->msecs = nt % QSEC_MSECS_PER_SEC;*/
bt->wday = (days + 4) % QSE_DAY_IN_WEEK;
secs = nt / QSE_MSECS_PER_SEC;
days = secs / QSE_SECS_PER_DAY;
secs %= QSE_SECS_PER_DAY;
while (days >= QSE_DAY_IN_YEAR(year))
while (secs < 0)
{
days -= QSE_DAY_IN_YEAR(year);
year++;
secs += QSE_SECS_PER_DAY;
--days;
}
bt->year = year - 1900;
bt->yday = days;
bt->mon = 0;
while (days >= mdays[QSE_IS_LEAPYEAR(year)][bt->mon])
while (secs >= QSE_SECS_PER_DAY)
{
days -= mdays[QSE_IS_LEAPYEAR(year)][bt->mon];
bt->mon++;
secs -= QSE_SECS_PER_DAY;
++days;
}
bt->hour = secs / QSE_SECS_PER_HOUR;
secs %= QSE_SECS_PER_HOUR;
bt->min = secs / QSE_SECS_PER_MIN;
bt->sec = secs % QSE_SECS_PER_MIN;
bt->wday = (days + QSE_EPOCH_WDAY) % QSE_DAYS_PER_WEEK;
if (bt->wday < 0) bt->wday += QSE_DAYS_PER_WEEK;
if (days >= 0)
{
while (days >= QSE_DAYS_PER_YEAR(year))
{
days -= QSE_DAYS_PER_YEAR(year);
year++;
}
}
else
{
do
{
year--;
days += QSE_DAYS_PER_YEAR(year);
}
while (days < 0);
}
bt->year = year - QSE_BTIME_YEAR_BASE;
bt->yday = days;
midx = QSE_IS_LEAPYEAR(year)? 1: 0;
for (bt->mon = 0; days >= mdays[midx][bt->mon]; bt->mon++)
{
days -= mdays[midx][bt->mon];
}
bt->mday = days + 1;
bt->isdst = 0;
bt->offset = offset;
}
void qse_gmtime (qse_ntime_t nt, qse_btime_t* bt)
{
brkdntime (nt, bt, 0);
}