@@ -161,6 +161,37 @@ STATIC mp_obj_t mod_time_localtime(size_t n_args, const mp_obj_t *args) {
161
161
}
162
162
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mod_time_localtime_obj , 0 , 1 , mod_time_localtime );
163
163
164
+ STATIC mp_obj_t mod_time_mktime (mp_obj_t tuple ) {
165
+ size_t len ;
166
+ mp_obj_t * elem ;
167
+ mp_obj_get_array (tuple , & len , & elem );
168
+
169
+ // localtime generates a tuple of len 8. CPython uses 9, so we accept both.
170
+ if (len < 8 || len > 9 ) {
171
+ mp_raise_TypeError ("mktime needs a tuple of length 8 or 9" );
172
+ }
173
+
174
+ struct tm time = {
175
+ .tm_year = mp_obj_get_int (elem [0 ]) - 1900 ,
176
+ .tm_mon = mp_obj_get_int (elem [1 ]) - 1 ,
177
+ .tm_mday = mp_obj_get_int (elem [2 ]),
178
+ .tm_hour = mp_obj_get_int (elem [3 ]),
179
+ .tm_min = mp_obj_get_int (elem [4 ]),
180
+ .tm_sec = mp_obj_get_int (elem [5 ]),
181
+ };
182
+ if (len == 9 ) {
183
+ time .tm_isdst = mp_obj_get_int (elem [8 ]);
184
+ } else {
185
+ time .tm_isdst = -1 ; // auto-detect
186
+ }
187
+ time_t ret = mktime (& time );
188
+ if (ret == -1 ) {
189
+ mp_raise_msg (& mp_type_OverflowError , "invalid mktime usage" );
190
+ }
191
+ return mp_obj_new_int (ret );
192
+ }
193
+ MP_DEFINE_CONST_FUN_OBJ_1 (mod_time_mktime_obj , mod_time_mktime );
194
+
164
195
STATIC const mp_rom_map_elem_t mp_module_time_globals_table [] = {
165
196
{ MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR_utime ) },
166
197
{ MP_ROM_QSTR (MP_QSTR_clock ), MP_ROM_PTR (& mod_time_clock_obj ) },
@@ -174,6 +205,7 @@ STATIC const mp_rom_map_elem_t mp_module_time_globals_table[] = {
174
205
{ MP_ROM_QSTR (MP_QSTR_ticks_add ), MP_ROM_PTR (& mp_utime_ticks_add_obj ) },
175
206
{ MP_ROM_QSTR (MP_QSTR_ticks_diff ), MP_ROM_PTR (& mp_utime_ticks_diff_obj ) },
176
207
{ MP_ROM_QSTR (MP_QSTR_localtime ), MP_ROM_PTR (& mod_time_localtime_obj ) },
208
+ { MP_ROM_QSTR (MP_QSTR_mktime ), MP_ROM_PTR (& mod_time_mktime_obj ) },
177
209
};
178
210
179
211
STATIC MP_DEFINE_CONST_DICT (mp_module_time_globals , mp_module_time_globals_table );
0 commit comments