forked from enlightenment/efl
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:
parent
3af1a8af1e
commit
a2dbaa2759
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue