summaryrefslogtreecommitdiff
path: root/src/time
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2020-08-15 10:11:53 -0400
committerJakob Kaivo <jkk@ung.org>2020-08-15 10:11:53 -0400
commit076cc42d3bb1e2f3b91d815e08d8d7e199a2be7a (patch)
tree14f5cebf70b112b9a8b258eb156f065aa74febaa /src/time
parent52da330cd1783a4a0cdf26f7b10326aac2502c73 (diff)
first draft
Diffstat (limited to 'src/time')
-rw-r--r--src/time/mktime.c70
1 files changed, 68 insertions, 2 deletions
diff --git a/src/time/mktime.c b/src/time/mktime.c
index 9e58d4eb..d19ad8d6 100644
--- a/src/time/mktime.c
+++ b/src/time/mktime.c
@@ -1,11 +1,77 @@
#include <time.h>
+#include "_time.h"
+#include "_assert.h"
/** convert time structure to arithmetic type **/
time_t mktime(struct tm * timeptr)
{
- (void)timeptr;
- return (time_t)-1;
+ int i;
+
+ ASSERT_NONNULL(timeptr);
+
+ while (timeptr->tm_sec < 0) {
+ timeptr->tm_min--;
+ timeptr->tm_sec += SEC_PER_MIN;
+ }
+
+ if (timeptr->tm_sec >= SEC_PER_MIN) {
+ timeptr->tm_min += timeptr->tm_sec / SEC_PER_MIN;
+ timeptr->tm_sec %= SEC_PER_MIN;
+ }
+
+ while (timeptr->tm_min < 0) {
+ timeptr->tm_hour--;
+ timeptr->tm_min += MIN_PER_HR;
+ }
+
+ if (timeptr->tm_min >= MIN_PER_HR) {
+ timeptr->tm_hour += timeptr->tm_min / MIN_PER_HR;
+ timeptr->tm_sec %= MIN_PER_HR;
+ }
+
+ while (timeptr->tm_hour < 0) {
+ timeptr->tm_mday--;
+ timeptr->tm_hour += HR_PER_DAY;
+ }
+
+ if (timeptr->tm_hour >= HR_PER_DAY) {
+ timeptr->tm_mday += timeptr->tm_hour / HR_PER_DAY;
+ timeptr->tm_hour %= HR_PER_DAY;
+ }
+
+ /* tm_mday is 1 based */
+ while (timeptr->tm_mday < 1) {
+ timeptr->tm_mon--;
+ timeptr->tm_mday += DAYS_IN(timeptr->tm_year, timeptr->tm_mon);
+ }
+
+ while (timeptr->tm_mday > DAYS_IN(timeptr->tm_year, timeptr->tm_mon)) {
+ timeptr->tm_mday -= DAYS_IN(timeptr->tm_year, timeptr->tm_mon);
+ timeptr->tm_mon++;
+ }
+
+ /* negative years are OK, it just means before 1900 */
+
+ if (timeptr->tm_mon >= MON_PER_YEAR) {
+ timeptr->tm_year += timeptr->tm_mon / MON_PER_YEAR;
+ timeptr->tm_mon %= MON_PER_YEAR;
+ }
+
+ timeptr->tm_yday = 0;
+ for (i = 1; i < timeptr->tm_mon; i++) {
+ timeptr->tm_yday += DAYS_IN(timeptr->tm_year, timeptr->tm_mon);
+ }
+ timeptr->tm_yday += timeptr->tm_mday;
+
+ /* TODO: timeptr->tm_wday */
+ /* TODO: timeptr->tm_isdst */
+
+ return ((timeptr->tm_year - EPOCH_YEAR) * SEC_PER_YEAR)
+ + (timeptr->tm_yday * SEC_PER_DAY)
+ + (timeptr->tm_hour * SEC_PER_HR)
+ + (timeptr->tm_min * SEC_PER_MIN)
+ + timeptr->tm_sec;
}
/***