6 #include "util_const.h"
16 static MNode* timeval6 (struct tm* v) {
19 ans.append (newMNode_num (v->tm_year + 1900));
20 ans.append (newMNode_num (v->tm_mon + 1));
21 ans.append (newMNode_num (v->tm_mday));
22 ans.append (newMNode_num (v->tm_hour));
23 ans.append (newMNode_num (v->tm_min));
24 ans.append (newMNode_num (v->tm_sec));
26 return ans.release ();
29 static MNode* dateval7 (struct tm* v) {
32 ans.append (newMNode_num (v->tm_year + 1900));
33 ans.append (newMNode_num (v->tm_mon + 1));
34 ans.append (newMNode_num (v->tm_mday));
35 ans.append (newMNode_num (v->tm_wday));
36 ans.append (newMNode_num (v->tm_hour));
37 ans.append (newMNode_num (v->tm_min));
38 ans.append (newMNode_num (v->tm_sec));
40 return ans.release ();
43 static MNode* timeval3 (struct tm* v) {
46 ans.append (newMNode_num (v->tm_hour));
47 ans.append (newMNode_num (v->tm_min));
48 ans.append (newMNode_num (v->tm_sec));
50 return ans.release ();
60 MNode* ml_now (MNode* cell, MlEnv* mlenv) {
61 MNode* arg = cell->cdr ();
65 throw (uErrorWrongNumber);
68 return newMNode_num (tm);
73 (now-microsec) -> SECOND.MICROSECOND
76 //#AFUNC now-microsec ml_now_microsec
77 //#WIKIFUNC now-microsec
78 MNode* ml_now_microsec (MNode* cell, MlEnv* mlenv) {
79 MNode* arg = cell->cdr ();
82 throw (uErrorWrongNumber);
84 return newMNode_num (now_microsec ());
89 (to-date INTEGER) -> (YEAR MONTH DAY HOUR MINUTE SECOND)
92 //#AFUNC to-date ml_datetime3
94 MNode* ml_datetime3 (MNode* cell, MlEnv* mlenv) {
95 MNode* arg = cell->cdr ();
100 throw (uErrorWrongNumber);
101 tm = (time_t)eval_double (arg->car (), mlenv);
104 throw (uErrorWrongNumber);
106 localtime_r (&tm, &v);
108 return timeval6 (&v);
113 (to-date4 INTEGER) -> (YEAR MONTH DAY WEEK HOUR MINUTE SECOND)
116 //#AFUNC to-date4 ml_date4
118 MNode* ml_date4 (MNode* cell, MlEnv* mlenv) {
119 MNode* arg = cell->cdr ();
124 throw (uErrorWrongNumber);
125 tm = (time_t)eval_double (arg->car (), mlenv);
128 throw (uErrorWrongNumber);
130 localtime_r (&tm, &v);
132 return dateval7 (&v);
137 (to-time INTEGER) -> (HOUR MINUTE SECOND)
140 //#AFUNC to-time ml_time3
142 MNode* ml_time3 (MNode* cell, MlEnv* mlenv) {
143 MNode* arg = cell->cdr ();
150 throw (uErrorWrongNumber);
151 tm = (time_t)eval_double (arg->car (), mlenv);
154 throw (uErrorWrongNumber);
156 localtime_r (&tm, &v);
158 return timeval3 (&v);
163 (date-to-time YEAR MONTH DAY [HOUR [MINUTE [SECOND]]]) -> NUMBER
164 (date-to-time (YEAR MONTH DAY [HOUR [MINUTE [SECOND]]])) -> NUMBER
167 //#AFUNC date-to-time ml_datetotime
168 //#WIKIFUNC date-to-time
169 MNode* ml_datetotime (MNode* cell, MlEnv* mlenv) {
170 MNode* arg = cell->cdr ();
174 memset (&tm, 0, sizeof (tm));
177 throw (uErrorWrongNumber);
179 v = eval (arg->car (), mlenv);
181 if (v () && v ()->isCons ()) {
183 throw (uErrorWrongNumber);
185 tm.tm_year = eval_int (arg->car (), mlenv) - 1900;
186 nextNodeNonNil (arg);
188 tm.tm_year = to_int (v ()) - 1900;
190 throw (uErrorWrongNumber);
192 tm.tm_mon = eval_int (arg->car (), mlenv) - 1;
193 nextNodeNonNil (arg);
194 tm.tm_mday = eval_int (arg->car (), mlenv);
197 tm.tm_hour = eval_int (arg->car (), mlenv);
201 tm.tm_min = eval_int (arg->car (), mlenv);
205 tm.tm_sec = eval_int (arg->car (), mlenv);
209 throw (uErrorWrongNumber);
211 return newMNode_num (mktime (&tm));
216 (to-gmdate INTEGER) -> (YEAR MONTH DAY HOUR MINUTE SECOND)
219 //#AFUNC to-gmdate ml_gmdatetime3
220 //#WIKIFUNC to-gmdate
221 MNode* ml_gmdatetime3 (MNode* cell, MlEnv* mlenv) {
222 MNode* arg = cell->cdr ();
229 throw (uErrorWrongNumber);
230 tm = (time_t)eval_double (arg->car (), mlenv);
233 throw (uErrorWrongNumber);
237 return timeval6 (&v);
242 (to-gmdate4 INTEGER) -> (YEAR MONTH DAY WEEK HOUR MINUTE SECOND)
245 //#AFUNC to-gmdate4 ml_gmdate4
246 //#WIKIFUNC to-gmdate4
247 MNode* ml_gmdate4 (MNode* cell, MlEnv* mlenv) {
248 MNode* arg = cell->cdr ();
253 throw (uErrorWrongNumber);
254 tm = (time_t)eval_double (arg->car (), mlenv);
257 throw (uErrorWrongNumber);
261 return dateval7 (&v);
266 (to-gmtime INTEGER) -> (HOUR MINUTE SECOND)
269 //#AFUNC to-gmtime ml_gmtime3
270 //#WIKIFUNC to-gmtime
271 MNode* ml_gmtime3 (MNode* cell, MlEnv* mlenv) {
272 MNode* arg = cell->cdr ();
279 throw (uErrorWrongNumber);
280 tm = (time_t)eval_double (arg->car (), mlenv);
283 throw (uErrorWrongNumber);
287 return timeval3 (&v);
292 (gmdate-to-time YEAR MONTH DAY [HOUR [MINUTE [SECOND]]]) -> NUMBER
293 (gmdate-to-time (YEAR MONTH DAY [HOUR [MINUTE [SECOND]]])) -> NUMBER
296 //#AFUNC gmdate-to-time ml_gmdatetotime
297 //#WIKIFUNC gmdate-to-time
298 MNode* ml_gmdatetotime (MNode* cell, MlEnv* mlenv) {
299 MNode* arg = cell->cdr ();
303 memset (&tm, 0, sizeof (tm));
306 throw (uErrorWrongNumber);
308 v = eval (arg->car (), mlenv);
310 if (v () && v ()->isCons ()) {
312 throw (uErrorWrongNumber);
314 tm.tm_year = eval_int (arg->car (), mlenv) - 1900;
315 nextNodeNonNil (arg);
317 tm.tm_year = to_int (v ()) - 1900;
319 throw (uErrorWrongNumber);
321 tm.tm_mon = eval_int (arg->car (), mlenv) - 1;
322 nextNodeNonNil (arg);
323 tm.tm_mday = eval_int (arg->car (), mlenv);
326 tm.tm_hour = eval_int (arg->car (), mlenv);
330 tm.tm_min = eval_int (arg->car (), mlenv);
334 tm.tm_sec = eval_int (arg->car (), mlenv);
338 throw (uErrorWrongNumber);
340 return newMNode_num (timegm (&tm));