adding time functions
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: StdAwk.cpp 499 2008-12-16 09:42:48Z baconevi $
|
||||
* $Id: StdAwk.cpp 501 2008-12-17 08:39:15Z baconevi $
|
||||
*
|
||||
* {License}
|
||||
*/
|
||||
@ -67,7 +67,7 @@ int StdAwk::open ()
|
||||
|
||||
int StdAwk::run (const char_t* main, const char_t** args, size_t nargs)
|
||||
{
|
||||
ase_time_t now;
|
||||
ase_ntime_t now;
|
||||
|
||||
if (ase_gettime(&now) == -1) this->seed = 0;
|
||||
else this->seed = (unsigned int)now;
|
||||
@ -224,7 +224,7 @@ int StdAwk::srand (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
|
||||
if (nargs == 0)
|
||||
{
|
||||
ase_time_t now;
|
||||
ase_ntime_t now;
|
||||
|
||||
if (ase_gettime (&now) == -1)
|
||||
this->seed = (unsigned int)now;
|
||||
@ -249,9 +249,12 @@ int StdAwk::srand (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
int StdAwk::systime (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
ase_time_t now;
|
||||
if (ase_gettime (&now) == -1) now = 0;
|
||||
return ret.set ((long_t)now / ASE_MSEC_IN_SEC);
|
||||
ase_ntime_t now;
|
||||
|
||||
if (ase_gettime(&now) == -1)
|
||||
return ret.set (ASE_TYPE_MIN(long_t));
|
||||
else
|
||||
return ret.set ((long_t)now / ASE_MSEC_IN_SEC);
|
||||
}
|
||||
|
||||
int StdAwk::strftime (Run& run, Return& ret, const Argument* args, size_t nargs,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: awk.c 496 2008-12-15 09:56:48Z baconevi $
|
||||
* $Id: awk.c 501 2008-12-17 08:39:15Z baconevi $
|
||||
*
|
||||
* {License}
|
||||
*/
|
||||
@ -454,6 +454,7 @@ int ase_awk_setword (ase_awk_t* awk,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* TODO: XXXX */
|
||||
int ase_awk_setrexfns (ase_awk_t* awk, ase_awk_rexfns_t* rexfns)
|
||||
{
|
||||
if (rexfns->build == ASE_NULL ||
|
||||
|
@ -708,7 +708,7 @@ int ase_awk_runsimple (ase_awk_t* awk, ase_char_t** icf, ase_awk_runcbs_t* cbs)
|
||||
ase_awk_runios_t ios;
|
||||
runio_data_t rd;
|
||||
rxtn_t rxtn;
|
||||
ase_time_t now;
|
||||
ase_ntime_t now;
|
||||
|
||||
rd.ic.files = icf;
|
||||
rd.ic.index = 0;
|
||||
@ -1033,7 +1033,7 @@ static int bfn_srand (ase_awk_run_t* run, const ase_char_t* fnm, ase_size_t fnl)
|
||||
}
|
||||
else
|
||||
{
|
||||
ase_time_t now;
|
||||
ase_ntime_t now;
|
||||
|
||||
if (ase_gettime(&now) == -1) rxtn->seed >>= 1;
|
||||
else rxtn->seed = (unsigned int)now;
|
||||
@ -1055,12 +1055,14 @@ static int bfn_srand (ase_awk_run_t* run, const ase_char_t* fnm, ase_size_t fnl)
|
||||
static int bfn_systime (ase_awk_run_t* run, const ase_char_t* fnm, ase_size_t fnl)
|
||||
{
|
||||
ase_awk_val_t* r;
|
||||
ase_time_t now;
|
||||
ase_ntime_t now;
|
||||
int n;
|
||||
|
||||
if (ase_gettime(&now) == -1) now = 0;
|
||||
if (ase_gettime(&now) == -1)
|
||||
r = ase_awk_makeintval (run, ASE_TYPE_MIN(ase_long_t));
|
||||
else
|
||||
r = ase_awk_makeintval (run, now / ASE_MSEC_IN_SEC);
|
||||
|
||||
r = ase_awk_makeintval (run, now / ASE_MSEC_IN_SEC);
|
||||
if (r == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM);
|
||||
|
@ -11,23 +11,28 @@
|
||||
#include <time.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#define WIN_EPOCH_YEAR ((ase_time_t)1601)
|
||||
#define WIN_EPOCH_MON ((ase_time_t)1)
|
||||
#define WIN_EPOCH_DAY ((ase_time_t)1)
|
||||
|
||||
#define EPOCH_DIFF_YEARS (ASE_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 * ASE_MSEC_IN_SEC)
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(ASE_USE_SYSCALL) && defined(HAVE_SYS_SYSCALL_H)
|
||||
#include <sys/syscall.h>
|
||||
#endif
|
||||
|
||||
int ase_gettime (ase_time_t* t)
|
||||
#ifdef _WIN32
|
||||
#define WIN_EPOCH_YEAR ((ase_ntime_t)1601)
|
||||
#define WIN_EPOCH_MON ((ase_ntime_t)1)
|
||||
#define WIN_EPOCH_DAY ((ase_ntime_t)1)
|
||||
|
||||
#define EPOCH_DIFF_YEARS (ASE_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*ASE_MSEC_IN_SEC)
|
||||
#endif
|
||||
|
||||
static int ytab[2][12] =
|
||||
{
|
||||
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
|
||||
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
|
||||
};
|
||||
|
||||
int ase_gettime (ase_ntime_t* t)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
SYSTEMTIME st;
|
||||
@ -40,7 +45,7 @@ int ase_gettime (ase_time_t* t)
|
||||
|
||||
GetSystemTime (&st);
|
||||
if (SystemTimeToFileTime (&st, &ft) == FALSE) return -1;
|
||||
*t = ((ase_time_t)(*((ase_int64_t*)&ft)) / (10 * 1000));
|
||||
*t = ((ase_ntime_t)(*((ase_int64_t*)&ft)) / (10 * 1000));
|
||||
*t -= EPOCH_DIFF_MSECS;
|
||||
return 0;
|
||||
#else
|
||||
@ -59,7 +64,7 @@ int ase_gettime (ase_time_t* t)
|
||||
#endif
|
||||
}
|
||||
|
||||
int ase_settime (ase_time_t t)
|
||||
int ase_settime (ase_ntime_t t)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
FILETIME ft;
|
||||
@ -86,3 +91,42 @@ int ase_settime (ase_time_t t)
|
||||
#endif
|
||||
}
|
||||
|
||||
void ase_gmtime (ase_ntime_t nt, ase_btime_t* bt)
|
||||
{
|
||||
/* code based on minix 2.0 src/lib/ansi/gmtime.c */
|
||||
|
||||
ase_ntime_t days; /* total days */
|
||||
ase_ntime_t secs; /* number of seconds in the fractional days */
|
||||
ase_ntime_t time; /* total seconds */
|
||||
|
||||
int year = ASE_EPOCH_YEAR;
|
||||
|
||||
time = nt / ASE_MSEC_IN_SEC;
|
||||
days = (unsigned long)time / ASE_SEC_IN_DAY;
|
||||
secs = (unsigned long)time % ASE_SEC_IN_DAY;
|
||||
|
||||
bt->sec = secs % ASE_SEC_IN_MIN;
|
||||
bt->min = (secs % ASE_SEC_IN_HOUR) / ASE_SEC_IN_MIN;
|
||||
bt->hour = secs / ASE_SEC_IN_HOUR;
|
||||
|
||||
bt->wday = (days + 4) % ASE_DAY_IN_WEEK;
|
||||
|
||||
while (days >= ASE_DAY_IN_YEAR(year))
|
||||
{
|
||||
days -= ASE_DAY_IN_YEAR(year);
|
||||
year++;
|
||||
}
|
||||
|
||||
bt->year = year - 1900;
|
||||
bt->yday = days;
|
||||
bt->mon = 0;
|
||||
|
||||
while (days >= ytab[ASE_IS_LEAPYEAR(year)][bt->mon])
|
||||
{
|
||||
days -= ytab[ASE_IS_LEAPYEAR(year)][bt->mon];
|
||||
bt->mon++;
|
||||
}
|
||||
|
||||
bt->mday = days + 1;
|
||||
bt->isdst = 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user