aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/embryo/src/lib/embryo_time.c
blob: 8392ec362a9d8a44816c10309d7ccf5391abdda5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif

#ifndef HAVE_GETTIMEOFDAY
# error "Your platform isn't supported yet"
#endif

#include <sys/time.h>
#include <time.h>

#ifdef _MSC_VER
# include <winsock2.h>
#endif

#ifdef HAVE_EVIL
# include <Evil.h>
#endif

#include "Embryo.h"
#include "embryo_private.h"

/* exported time api */

static Embryo_Cell
_embryo_time_seconds(Embryo_Program *ep __UNUSED__, Embryo_Cell *params __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);
}