aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/embryo/embryo_time.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/embryo/embryo_time.c')
-rw-r--r--src/lib/embryo/embryo_time.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/lib/embryo/embryo_time.c b/src/lib/embryo/embryo_time.c
new file mode 100644
index 000000000..8725377b0
--- /dev/null
+++ b/src/lib/embryo/embryo_time.c
@@ -0,0 +1,95 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/time.h>
+#include <time.h>
+
+#ifdef _MSC_VER
+# include <winsock2.h>
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#ifdef HAVE_EXOTIC
+# include <Exotic.h>
+#endif
+
+#include <Eina.h>
+
+#include "Embryo.h"
+#include "embryo_private.h"
+
+/* exported time api */
+
+static Embryo_Cell
+_embryo_time_seconds(Embryo_Program *ep EINA_UNUSED, Embryo_Cell *params EINA_UNUSED)
+{
+ struct timeval timev;
+ double t;
+ float f;
+
+ gettimeofday(&timev, NULL);
+ t = (double)(timev.tv_sec - ((timev.tv_sec / (60 * 60 * 24)) * (60 * 60 * 24)))
+ + (((double)timev.tv_usec) / 1000000);
+ f = (float)t;
+ return EMBRYO_FLOAT_TO_CELL(f);
+}
+
+static Embryo_Cell
+_embryo_time_date(Embryo_Program *ep, Embryo_Cell *params)
+{
+ static time_t last_tzset = 0;
+ struct timeval timev;
+ struct tm *tm;
+ time_t tt;
+
+ if (params[0] != (8 * sizeof(Embryo_Cell))) return 0;
+ gettimeofday(&timev, NULL);
+ tt = (time_t)(timev.tv_sec);
+ if ((tt > (last_tzset + 1)) ||
+ (tt < (last_tzset - 1)))
+ {
+ last_tzset = tt;
+ tzset();
+ }
+ tm = localtime(&tt);
+ if (tm)
+ {
+ Embryo_Cell *cptr;
+ double t;
+ float f;
+
+ cptr = embryo_data_address_get(ep, params[1]);
+ if (cptr) *cptr = tm->tm_year + 1900;
+ cptr = embryo_data_address_get(ep, params[2]);
+ if (cptr) *cptr = tm->tm_mon + 1;
+ cptr = embryo_data_address_get(ep, params[3]);
+ if (cptr) *cptr = tm->tm_mday;
+ cptr = embryo_data_address_get(ep, params[4]);
+ if (cptr) *cptr = tm->tm_yday;
+ cptr = embryo_data_address_get(ep, params[5]);
+ if (cptr) *cptr = (tm->tm_wday + 6) % 7;
+ cptr = embryo_data_address_get(ep, params[6]);
+ if (cptr) *cptr = tm->tm_hour;
+ cptr = embryo_data_address_get(ep, params[7]);
+ if (cptr) *cptr = tm->tm_min;
+ cptr = embryo_data_address_get(ep, params[8]);
+ 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
+_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);
+}