From a7d4a56bcc2a6e7d4280bb75751f4ba701810c3e Mon Sep 17 00:00:00 2001 From: "Rustem Gimadutdinov (rgimad)" Date: Thu, 7 May 2020 12:22:17 +0000 Subject: [PATCH] fix bug in "localtime" and "mktime" functions git-svn-id: svn://kolibrios.org@7888 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/ktcc/trunk/bin/lib/libck.a | Bin 127472 -> 127772 bytes .../develop/ktcc/trunk/libc/stdlib/time.c | 61 ++++++++++++------ 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/programs/develop/ktcc/trunk/bin/lib/libck.a b/programs/develop/ktcc/trunk/bin/lib/libck.a index d1ea2fdcf6396f526a8036b60dac0855f8560f49..910d97397bc1e4a3b25ccf773d8ba7cb9ec3ded9 100644 GIT binary patch delta 3250 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 16; - __buffertime.tm_mon = ((kos_date & 0xFF00) >> 8) -1; - __buffertime.tm_year = kos_date >> 16 + 100; - - __buffertime.tm_wday = __buffertime.tm_yday = __buffertime.tm_isdst = -1; /* temporary */ - - __buffertime.tm_sec = kos_time >> 16; - __buffertime.tm_min = (kos_time & 0xFF00) >> 8; - __buffertime.tm_hour = kos_time & 0xFF; + kos_date = _ksys_get_date(); + kos_time = _ksys_get_system_clock(); + + int bcd_day = (kos_date >> 16); + int bcd_mon = ((kos_date & 0xFF00) >> 8); + int bcd_year = (kos_date & 0xFF); + __buffertime.tm_mday = ((bcd_day & 0xF0)>>4)*10 + (bcd_day & 0x0F); + __buffertime.tm_mon = ((bcd_mon & 0xF0)>>4)*10 + (bcd_mon & 0x0F) - 1; + __buffertime.tm_year = ((bcd_year & 0xF0)>>4)*10 + (bcd_year & 0x0F) + 100; + + __buffertime.tm_wday = __buffertime.tm_yday = __buffertime.tm_isdst = -1; /* temporary */ + + int bcd_sec = (kos_time >> 16); + int bcd_min = ((kos_time & 0xFF00) >> 8); + int bcd_hour = (kos_time & 0xFF); + + __buffertime.tm_sec = ((bcd_sec & 0xF0)>>4)*10 + (bcd_sec & 0x0F); + __buffertime.tm_min = ((bcd_min & 0xF0)>>4)*10 + (bcd_min & 0x0F); + __buffertime.tm_hour = ((bcd_hour & 0xF0)>>4)*10 + (bcd_hour & 0x0F); return &__buffertime; } @@ -36,23 +43,41 @@ time_t time (time_t* timer) time_t mktime (struct tm * timeptr) { - int y, m, d; + /*int y, m, d; time_t t; y = timeptr->tm_year + 1900; m = timeptr->tm_mon + 1; - d = timeptr->tm_mday; /* to -1 or not to -1? */ + d = timeptr->tm_mday; // to -1 or not to -1? if (m < 3) { m += 12; y -= 1; } - t = y * 365 + y / 4 + y /400 - y / 100; /* years - > days */ - t += 30 * m + 3 * (m + 1) / 5 + d; /* add month days */ + t = y * 365 + y / 4 + y /400 - y / 100; // years - > days + t += 30 * m + 3 * (m + 1) / 5 + d; // add month days - t -= 719561; /* 01 jan 1970 */ + t -= 719561; // 01 jan 1970 t *= 86400; t += 3600 * timeptr->tm_hour + 60 * timeptr->tm_min + timeptr->tm_sec; - return t; + return t;*/ + + int utcdiff = -3; + const int mon_days [] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + unsigned long int tyears, tdays, leaps, utc_hrs; + int i; + + tyears = timeptr->tm_year - 70 ;// tm->tm_year is from 1900. + leaps = (tyears + 2) / 4; // no of next two lines until year 2100. + i = (timeptr->tm_year - 100) / 100; + leaps -= ( (i/4)*3 + i%4 ); + tdays = 0; + for (i=0; i < timeptr->tm_mon; i++) tdays += mon_days[i]; + + tdays += timeptr->tm_mday-1; // days of month passed. + tdays = tdays + (tyears * 365) + leaps; + + utc_hrs = timeptr->tm_hour + utcdiff; // for your time zone. + return (tdays * 86400) + (utc_hrs * 3600) + (timeptr->tm_min * 60) + timeptr->tm_sec; } double difftime (time_t end, time_t beginning)