enhanced qse_timegm() further

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

View File

@ -1,9 +1,19 @@
QSE provides a script engine for various scripting languages and utility programs. It aims to produce a flexible script engine framework that can be embedded into an application. A hosting application can access various aspects of the embedded script engine and vice versa. QSE is a code library that implements various Unix utilities in an
embeddable form and provides a set of APIs to embed them into an application.
The APIs have been designed to be flexible enough to access various aspects of
a hosting application and an embedded object from each other. By embedding
a Unix utility into an application, a developer is relieved of the need to
invoke an external command and is given tighter control over it.
The library is licended under the Apache License, Version 2.0. Currently the library implements the following utilities:
- SED Stream Editor
- AWK Interpreter
As the library grows, more utilities will be added.
The library is licensed under the Apache License, Version 2.0.
The project webpage: http://qse.googlecode.com/ The project webpage: http://qse.googlecode.com/
For furthur information, contact: For further information, contact:
Chung, Hyung-Hwan <bacon@abiyo.net> Chung, Hyung-Hwan <bacon@abiyo.net>

View File

@ -242,14 +242,14 @@ int lsp_main (int argc, qse_char_t* argv[])
return -1; return -1;
} }
prmfns.mmgr.data = &prmfns_data; prmfns.mmgr.udd = &prmfns_data;
#else #else
prmfns.mmgr.data = QSE_NULL; prmfns.mmgr.udd = QSE_NULL;
#endif #endif
prmfns.misc.sprintf = custom_lsp_sprintf; prmfns.misc.sprintf = custom_lsp_sprintf;
prmfns.misc.dprintf = custom_lsp_dprintf; prmfns.misc.dprintf = custom_lsp_dprintf;
prmfns.misc.data = QSE_NULL; prmfns.misc.udd = QSE_NULL;
lsp = qse_lsp_open (&prmfns, opt_memsize, opt_meminc); lsp = qse_lsp_open (&prmfns, opt_memsize, opt_meminc);
if (lsp == QSE_NULL) if (lsp == QSE_NULL)

4
qse/configure vendored
View File

@ -17067,7 +17067,9 @@ fi
for ac_header in stddef.h wchar.h wctype.h errno.h signal.h sys/syscall.h
for ac_header in stddef.h wchar.h wctype.h errno.h signal.h time.h sys/time.h sys/syscall.h
do do
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then

View File

@ -87,7 +87,7 @@ AC_SUBST(LIBM, $LIBM)
dnl check header files. dnl check header files.
AC_HEADER_STDC AC_HEADER_STDC
AC_CHECK_HEADERS([stddef.h wchar.h wctype.h errno.h signal.h sys/syscall.h]) AC_CHECK_HEADERS([stddef.h wchar.h wctype.h errno.h signal.h time.h sys/time.h sys/syscall.h])
dnl check data types dnl check data types
AC_CHECK_TYPE([wchar_t], AC_CHECK_TYPE([wchar_t],

View File

@ -1,5 +1,5 @@
/* /*
* $Id: time.h 186 2009-06-06 13:42:57Z hyunghwan.chung $ * $Id: time.h 187 2009-06-07 05:03:44Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
@ -29,6 +29,9 @@
#define QSE_BTIME_YEAR_BASE (1900) #define QSE_BTIME_YEAR_BASE (1900)
#define QSE_DAYS_PER_NORMYEAR (365)
#define QSE_DAYS_PER_LEAPYEAR (366)
#define QSE_DAYS_PER_WEEK (7) #define QSE_DAYS_PER_WEEK (7)
#define QSE_MONS_PER_YEAR (12) #define QSE_MONS_PER_YEAR (12)
#define QSE_HOURS_PER_DAY (24) #define QSE_HOURS_PER_DAY (24)
@ -47,7 +50,8 @@
#define QSE_USECS_PER_SEC (QSE_USECS_PER_MSEC*QSE_MSECS_PER_SEC) #define QSE_USECS_PER_SEC (QSE_USECS_PER_MSEC*QSE_MSECS_PER_SEC)
#define QSE_IS_LEAPYEAR(year) ((!((year)%4) && ((year)%100)) || !((year)%400)) #define QSE_IS_LEAPYEAR(year) ((!((year)%4) && ((year)%100)) || !((year)%400))
#define QSE_DAYS_PER_YEAR(year) (QSE_IS_LEAPYEAR(year)? 366: 365) #define QSE_DAYS_PER_YEAR(year) \
(QSE_IS_LEAPYEAR(year)? QSE_DAYS_PER_LEAPYEAR: QSE_DAYS_PER_NORMYEAR)
/* number of milliseconds since the Epoch (00:00:00 UTC, Jan 1, 1970) */ /* number of milliseconds since the Epoch (00:00:00 UTC, Jan 1, 1970) */
typedef qse_long_t qse_ntime_t; typedef qse_long_t qse_ntime_t;

View File

@ -135,6 +135,9 @@
/* Define to 1 if you have the <sys/syscall.h> header file. */ /* Define to 1 if you have the <sys/syscall.h> header file. */
#undef HAVE_SYS_SYSCALL_H #undef HAVE_SYS_SYSCALL_H
/* Define to 1 if you have the <sys/time.h> header file. */
#undef HAVE_SYS_TIME_H
/* Define to 1 if you have the <sys/types.h> header file. */ /* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H #undef HAVE_SYS_TYPES_H
@ -153,6 +156,9 @@
/* Define to 1 if you have the `timelocal' function. */ /* Define to 1 if you have the `timelocal' function. */
#undef HAVE_TIMELOCAL #undef HAVE_TIMELOCAL
/* Define to 1 if you have the <time.h> header file. */
#undef HAVE_TIME_H
/* Define to 1 if you have the <unistd.h> header file. */ /* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H #undef HAVE_UNISTD_H

View File

@ -54,7 +54,7 @@ struct qse_lsp_prmfns_t
{ {
qse_lsp_sprintf_t sprintf; qse_lsp_sprintf_t sprintf;
qse_lsp_dprintf_t dprintf; qse_lsp_dprintf_t dprintf;
void* data; void* udd;
} misc; } misc;
}; };

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. Copyright 2006-2009 Chung, Hyung-Hwan.
@ -36,6 +36,12 @@
#ifdef HAVE_ERRNO_H #ifdef HAVE_ERRNO_H
# include <errno.h> # include <errno.h>
#endif #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) #if defined(QSE_USE_SYSCALL) && defined(HAVE_SYS_SYSCALL_H)
# include <sys/syscall.h> # include <sys/syscall.h>
@ -189,4 +195,17 @@
# define QSE_cHROOT(path) chroot(path) # define QSE_cHROOT(path) chroot(path)
#endif #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 #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. 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 } { 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 /* number of days from beginning of a previous month to the end of
* a previous month. adjust for leap years in the code. */ * the year. adjust for leap years in the code. */
static const int mdays_rtot[2][QSE_MONS_PER_YEAR] = static const int mdays_rtot[2][QSE_MONS_PER_YEAR] =
{ {
{ 334, 306, 275, 245, 214, 184, 153, 122, 92, 61, 31, 0 }, { 334, 306, 275, 245, 214, 184, 153, 122, 92, 61, 31, 0 },
{ 335, 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) int qse_gettime (qse_ntime_t* t)
{ {
#ifdef _WIN32 #ifdef _WIN32
@ -80,11 +89,7 @@ int qse_gettime (qse_ntime_t* t)
struct timeval tv; struct timeval tv;
int n; int n;
#ifdef SYS_gettimeofday n = QSE_GETTIMEOFDAY (&tv, QSE_NULL);
n = syscall (SYS_gettimeofday, &tv, QSE_NULL);
#else
n = gettimeofday (&tv, QSE_NULL);
#endif
if (n == -1) return -1; if (n == -1) return -1;
*t = (qse_ntime_t)tv.tv_sec*QSE_MSECS_PER_SEC + *t = (qse_ntime_t)tv.tv_sec*QSE_MSECS_PER_SEC +
@ -118,18 +123,10 @@ int qse_settime (qse_ntime_t t)
return r; return r;
} }
#elif HAVE_STIME #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 #else
*/ */
n = QSE_SETTIMEOFDAY (&tv, QSE_NULL);
#ifdef SYS_settimeofday
n = syscall (SYS_settimeofday, &tv, QSE_NULL);
#else
n = settimeofday (&tv, QSE_NULL);
#endif
if (n == -1) return -1; if (n == -1) return -1;
return 0; return 0;
#endif #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 y = bt->year + QSE_BTIME_YEAR_BASE;
int midx = QSE_IS_LEAPYEAR(y)? 1: 0; int midx = QSE_IS_LEAPYEAR(y)? 1: 0;
QSE_ASSERT (bt->mon >= 0 && bt->mon < QSE_MONS_PER_YEAR);
if (y < QSE_EPOCH_YEAR) if (y < QSE_EPOCH_YEAR)
{ {
int x; int x;
for (x = y; x < QSE_EPOCH_YEAR - 1; x++) /*for (x = y; x < QSE_EPOCH_YEAR - 1; x++)
n += QSE_DAYS_PER_YEAR(x); n += QSE_DAYS_PER_YEAR(x);*/
for (x = bt->mon + 1; x < QSE_MONS_PER_YEAR; x++) n = QSE_DAYS_PER_NORMYEAR * (QSE_EPOCH_YEAR - 1 - y) +
n += mdays[midx][x]; 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; n += mdays[midx][bt->mon] - bt->mday;
if (midx == 1) n -= 1; if (midx == 1) n -= 1;
@ -318,8 +321,10 @@ int qse_timegm (const qse_btime_t* bt, qse_ntime_t* nt)
{ {
int x; int x;
for (x = QSE_EPOCH_YEAR; x < y; x++) /*for (x = QSE_EPOCH_YEAR; x < y; x++)
n += QSE_DAYS_PER_YEAR(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];*/ /*for (x = 0; x < bt->mon; x++) n += mdays[midx][x];*/
n += mdays_tot[midx][bt->mon]; n += mdays_tot[midx][bt->mon];

View File

@ -64,7 +64,7 @@ void qse_lsp_seterror (
{ {
case 0: case 0:
lsp->prmfns.misc.sprintf ( lsp->prmfns.misc.sprintf (
lsp->prmfns.misc.data, lsp->prmfns.misc.udd,
lsp->errmsg, lsp->errmsg,
QSE_COUNTOF(lsp->errmsg), QSE_COUNTOF(lsp->errmsg),
errfmt); errfmt);
@ -72,7 +72,7 @@ void qse_lsp_seterror (
case 1: case 1:
lsp->prmfns.misc.sprintf ( lsp->prmfns.misc.sprintf (
lsp->prmfns.misc.data, lsp->prmfns.misc.udd,
lsp->errmsg, lsp->errmsg,
QSE_COUNTOF(lsp->errmsg), QSE_COUNTOF(lsp->errmsg),
errfmt, errfmt,
@ -81,7 +81,7 @@ void qse_lsp_seterror (
case 2: case 2:
lsp->prmfns.misc.sprintf ( lsp->prmfns.misc.sprintf (
lsp->prmfns.misc.data, lsp->prmfns.misc.udd,
lsp->errmsg, lsp->errmsg,
QSE_COUNTOF(lsp->errmsg), QSE_COUNTOF(lsp->errmsg),
errfmt, errfmt,
@ -91,7 +91,7 @@ void qse_lsp_seterror (
case 3: case 3:
lsp->prmfns.misc.sprintf ( lsp->prmfns.misc.sprintf (
lsp->prmfns.misc.data, lsp->prmfns.misc.udd,
lsp->errmsg, lsp->errmsg,
QSE_COUNTOF(lsp->errmsg), QSE_COUNTOF(lsp->errmsg),
errfmt, errfmt,
@ -102,7 +102,7 @@ void qse_lsp_seterror (
case 4: case 4:
lsp->prmfns.misc.sprintf ( lsp->prmfns.misc.sprintf (
lsp->prmfns.misc.data, lsp->prmfns.misc.udd,
lsp->errmsg, lsp->errmsg,
QSE_COUNTOF(lsp->errmsg), QSE_COUNTOF(lsp->errmsg),
errfmt, errfmt,
@ -114,7 +114,7 @@ void qse_lsp_seterror (
case 5: case 5:
lsp->prmfns.misc.sprintf ( lsp->prmfns.misc.sprintf (
lsp->prmfns.misc.data, lsp->prmfns.misc.udd,
lsp->errmsg, lsp->errmsg,
QSE_COUNTOF(lsp->errmsg), QSE_COUNTOF(lsp->errmsg),
errfmt, errfmt,

View File

@ -34,7 +34,7 @@ qse_lsp_t* qse_lsp_open (
lsp = (qse_lsp_t*) malloc (QSE_SIZEOF(qse_lsp_t)); lsp = (qse_lsp_t*) malloc (QSE_SIZEOF(qse_lsp_t));
#else #else
lsp = (qse_lsp_t*) prmfns->mmgr.alloc ( lsp = (qse_lsp_t*) prmfns->mmgr.alloc (
prmfns->mmgr.data, QSE_SIZEOF(qse_lsp_t)); prmfns->mmgr.udd, QSE_SIZEOF(qse_lsp_t));
#endif #endif
if (lsp == QSE_NULL) return QSE_NULL; 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: case QSE_LSP_OBJ_INT:
#if QSE_SIZEOF_LONG_LONG > 0 #if QSE_SIZEOF_LONG_LONG > 0
lsp->prmfns.misc.sprintf ( lsp->prmfns.misc.sprintf (
lsp->prmfns.misc.data, lsp->prmfns.misc.udd,
buf, QSE_COUNTOF(buf), buf, QSE_COUNTOF(buf),
QSE_T("%lld"), (long long)QSE_LSP_IVAL(obj)); QSE_T("%lld"), (long long)QSE_LSP_IVAL(obj));
#elif QSE_SIZEOF___INT64 > 0 #elif QSE_SIZEOF___INT64 > 0
lsp->prmfns.misc.sprintf ( lsp->prmfns.misc.sprintf (
lsp->prmfns.misc.data, lsp->prmfns.misc.udd,
buf, QSE_COUNTOF(buf), buf, QSE_COUNTOF(buf),
QSE_T("%I64d"), (__int64)QSE_LSP_IVAL(obj)); QSE_T("%I64d"), (__int64)QSE_LSP_IVAL(obj));
#elif QSE_SIZEOF_LONG > 0 #elif QSE_SIZEOF_LONG > 0
lsp->prmfns.misc.sprintf ( lsp->prmfns.misc.sprintf (
lsp->prmfns.misc.data, lsp->prmfns.misc.udd,
buf, QSE_COUNTOF(buf), buf, QSE_COUNTOF(buf),
QSE_T("%ld"), (long)QSE_LSP_IVAL(obj)); QSE_T("%ld"), (long)QSE_LSP_IVAL(obj));
#elif QSE_SIZEOF_INT > 0 #elif QSE_SIZEOF_INT > 0
lsp->prmfns.misc.sprintf ( lsp->prmfns.misc.sprintf (
lsp->prmfns.misc.data, lsp->prmfns.misc.udd,
buf, QSE_COUNTOF(buf), buf, QSE_COUNTOF(buf),
QSE_T("%d"), (int)QSE_LSP_IVAL(obj)); QSE_T("%d"), (int)QSE_LSP_IVAL(obj));
#else #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: case QSE_LSP_OBJ_REAL:
lsp->prmfns.misc.sprintf ( lsp->prmfns.misc.sprintf (
lsp->prmfns.misc.data, lsp->prmfns.misc.udd,
buf, QSE_COUNTOF(buf), buf, QSE_COUNTOF(buf),
QSE_T("%Lf"), QSE_T("%Lf"),
#ifdef __MINGW32__ #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: default:
lsp->prmfns.misc.sprintf ( lsp->prmfns.misc.sprintf (
lsp->prmfns.misc.data, lsp->prmfns.misc.udd,
buf, QSE_COUNTOF(buf), buf, QSE_COUNTOF(buf),
QSE_T("unknown object type: %d"), QSE_LSP_TYPE(obj)); QSE_T("unknown object type: %d"), QSE_LSP_TYPE(obj));
OUTPUT_STR (lsp, buf); OUTPUT_STR (lsp, buf);