diff options
author | Jakob Kaivo <jkk@ung.org> | 2020-08-15 10:11:53 -0400 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2020-08-15 10:11:53 -0400 |
commit | 076cc42d3bb1e2f3b91d815e08d8d7e199a2be7a (patch) | |
tree | 14f5cebf70b112b9a8b258eb156f065aa74febaa /src/time | |
parent | 52da330cd1783a4a0cdf26f7b10326aac2502c73 (diff) |
first draft
Diffstat (limited to 'src/time')
-rw-r--r-- | src/time/mktime.c | 70 |
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; } /*** |