embryo: add tzdate function

in the case where a user wants to get the current date/time from a
specified timezone, this function allows a timezone string to be passed
as a parameter

@feature
This commit is contained in:
Mike Blumenkrantz 2016-02-22 12:35:27 -05:00
parent 3af1a8af1e
commit a2dbaa2759
2 changed files with 72 additions and 0 deletions

View File

@ -231,3 +231,10 @@ native Float:cbrt(Float:value);
native Float:exp(Float:value);
native Float:exp2(Float:value);
native Float:hypot(Float:valuex, Float:valuey);
/**************************************************************************/
/* ADDED in embryo 1.18 */
/**************************************************************************/
#define EMBRYO_118 118
/* return the current date, year, time etc. in the variables provided modified by timezone tz */
native tzdate(tz[], &year, &month, &day, &yearday, &weekday, &hr, &min, &Float:sec);

View File

@ -22,6 +22,15 @@
#include "Embryo.h"
#include "embryo_private.h"
#define STRGET(ep, str, par) { \
Embryo_Cell *___cptr; \
str = NULL; \
if ((___cptr = embryo_data_address_get(ep, par))) { \
int ___l; \
___l = embryo_data_string_length_get(ep, ___cptr); \
(str) = alloca(___l + 1); \
if (str) embryo_data_string_get(ep, ___cptr, str); \
} }
/* exported time api */
static Embryo_Cell
@ -84,6 +93,61 @@ _embryo_time_date(Embryo_Program *ep, Embryo_Cell *params)
return 0;
}
static Embryo_Cell
_embryo_time_tzdate(Embryo_Program *ep, Embryo_Cell *params)
{
struct timeval timev;
struct tm *tm;
time_t tt;
const char *tzenv;
char *tz, prevtz[128] = {0};
if (params[0] != (9 * sizeof(Embryo_Cell))) return 0;
STRGET(ep, tz, params[1]);
tzenv = getenv("TZ");
if (tzenv)
strncpy(prevtz, tzenv, sizeof(prevtz) - 1);
if (tz)
{
setenv("TZ", tz, 1);
tzset();
}
gettimeofday(&timev, NULL);
tt = (time_t)(timev.tv_sec);
tm = localtime(&tt);
if (prevtz[0])
setenv("TZ", prevtz, 1);
else
unsetenv("TZ");
tzset();
if (tm)
{
Embryo_Cell *cptr;
double t;
float f;
cptr = embryo_data_address_get(ep, params[2]);
if (cptr) *cptr = tm->tm_year + 1900;
cptr = embryo_data_address_get(ep, params[3]);
if (cptr) *cptr = tm->tm_mon + 1;
cptr = embryo_data_address_get(ep, params[4]);
if (cptr) *cptr = tm->tm_mday;
cptr = embryo_data_address_get(ep, params[5]);
if (cptr) *cptr = tm->tm_yday;
cptr = embryo_data_address_get(ep, params[6]);
if (cptr) *cptr = (tm->tm_wday + 6) % 7;
cptr = embryo_data_address_get(ep, params[7]);
if (cptr) *cptr = tm->tm_hour;
cptr = embryo_data_address_get(ep, params[8]);
if (cptr) *cptr = tm->tm_min;
cptr = embryo_data_address_get(ep, params[9]);
t = (double)tm->tm_sec + (((double)timev.tv_usec) / 1000000);
f = (float)t;
if (cptr) *cptr = EMBRYO_FLOAT_TO_CELL(f);
}
return 0;
}
/* functions used by the rest of embryo */
void
@ -91,5 +155,6 @@ _embryo_time_init(Embryo_Program *ep)
{
embryo_program_native_call_add(ep, "seconds", _embryo_time_seconds);
embryo_program_native_call_add(ep, "date", _embryo_time_date);
embryo_program_native_call_add(ep, "tzdate", _embryo_time_tzdate);
}