【完善】格式化 minilibc/time.c

This commit is contained in:
SummerGift 2019-05-16 08:48:19 +08:00
parent 9f300de9cc
commit e809ced607
1 changed files with 143 additions and 143 deletions

View File

@ -11,20 +11,20 @@
/* days per month -- nonleap! */ /* days per month -- nonleap! */
const short __spm[13] = const short __spm[13] =
{ 0, { 0,
(31), (31),
(31+28), (31 + 28),
(31+28+31), (31 + 28 + 31),
(31+28+31+30), (31 + 28 + 31 + 30),
(31+28+31+30+31), (31 + 28 + 31 + 30 + 31),
(31+28+31+30+31+30), (31 + 28 + 31 + 30 + 31 + 30),
(31+28+31+30+31+30+31), (31 + 28 + 31 + 30 + 31 + 30 + 31),
(31+28+31+30+31+30+31+31), (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31),
(31+28+31+30+31+30+31+31+30), (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30),
(31+28+31+30+31+30+31+31+30+31), (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31),
(31+28+31+30+31+30+31+31+30+31+30), (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30),
(31+28+31+30+31+30+31+31+30+31+30+31), (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31),
}; };
static long int timezone; static long int timezone;
static const char days[] = "Sun Mon Tue Wed Thu Fri Sat "; static const char days[] = "Sun Mon Tue Wed Thu Fri Sat ";
static const char months[] = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec "; static const char months[] = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ";
@ -34,183 +34,183 @@ static const char months[] = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ";
int __isleap(int year) int __isleap(int year)
{ {
/* every fourth year is a leap year except for century years that are /* every fourth year is a leap year except for century years that are
* not divisible by 400. */ * not divisible by 400. */
/* return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); */ /* return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); */
return (!(year % 4) && ((year % 100) || !(year % 400))); return (!(year % 4) && ((year % 100) || !(year % 400)));
} }
struct tm *gmtime_r(const time_t *timep, struct tm *r) struct tm *gmtime_r(const time_t *timep, struct tm *r)
{ {
time_t i; time_t i;
register time_t work = *timep % (SPD); register time_t work = *timep % (SPD);
r->tm_sec = work % 60; r->tm_sec = work % 60;
work /= 60; work /= 60;
r->tm_min = work % 60; r->tm_min = work % 60;
r->tm_hour = work / 60; r->tm_hour = work / 60;
work = *timep / (SPD); work = *timep / (SPD);
r->tm_wday = (4 + work) % 7; r->tm_wday = (4 + work) % 7;
for (i = 1970;; ++i) for (i = 1970;; ++i)
{ {
register time_t k = __isleap(i) ? 366 : 365; register time_t k = __isleap(i) ? 366 : 365;
if (work >= k) if (work >= k)
work -= k; work -= k;
else else
break; break;
} }
r->tm_year = i - 1900; r->tm_year = i - 1900;
r->tm_yday = work; r->tm_yday = work;
r->tm_mday = 1; r->tm_mday = 1;
if (__isleap(i) && (work > 58)) if (__isleap(i) && (work > 58))
{ {
if (work == 59) if (work == 59)
r->tm_mday = 2; /* 29.2. */ r->tm_mday = 2; /* 29.2. */
work -= 1; work -= 1;
} }
for (i = 11; i && (__spm[i] > work); --i) for (i = 11; i && (__spm[i] > work); --i)
; ;
r->tm_mon = i; r->tm_mon = i;
r->tm_mday += work - __spm[i]; r->tm_mday += work - __spm[i];
return r; return r;
} }
struct tm* localtime_r(const time_t* t, struct tm* r) struct tm* localtime_r(const time_t* t, struct tm* r)
{ {
time_t tmp; time_t tmp;
struct timezone tz = {0}; struct timezone tz = {0};
gettimeofday(0, &tz); gettimeofday(0, &tz);
timezone = tz.tz_minuteswest * 60L; timezone = tz.tz_minuteswest * 60L;
tmp = *t + timezone; tmp = *t + timezone;
return gmtime_r(&tmp, r); return gmtime_r(&tmp, r);
} }
struct tm* localtime(const time_t* t) struct tm* localtime(const time_t* t)
{ {
static struct tm tmp; static struct tm tmp;
return localtime_r(t, &tmp); return localtime_r(t, &tmp);
} }
time_t mktime(struct tm * const t) time_t mktime(struct tm * const t)
{ {
register time_t day; register time_t day;
register time_t i; register time_t i;
register time_t years = t->tm_year - 70; register time_t years = t->tm_year - 70;
if (t->tm_sec > 60) if (t->tm_sec > 60)
{ {
t->tm_min += t->tm_sec / 60; t->tm_min += t->tm_sec / 60;
t->tm_sec %= 60; t->tm_sec %= 60;
} }
if (t->tm_min > 60) if (t->tm_min > 60)
{ {
t->tm_hour += t->tm_min / 60; t->tm_hour += t->tm_min / 60;
t->tm_min %= 60; t->tm_min %= 60;
} }
if (t->tm_hour > 24) if (t->tm_hour > 24)
{ {
t->tm_mday += t->tm_hour / 24; t->tm_mday += t->tm_hour / 24;
t->tm_hour %= 24; t->tm_hour %= 24;
} }
if (t->tm_mon > 12) if (t->tm_mon > 12)
{ {
t->tm_year += t->tm_mon / 12; t->tm_year += t->tm_mon / 12;
t->tm_mon %= 12; t->tm_mon %= 12;
} }
while (t->tm_mday > __spm[1 + t->tm_mon]) while (t->tm_mday > __spm[1 + t->tm_mon])
{ {
if (t->tm_mon == 1 && __isleap(t->tm_year + 1900)) if (t->tm_mon == 1 && __isleap(t->tm_year + 1900))
{ {
--t->tm_mday; --t->tm_mday;
} }
t->tm_mday -= __spm[t->tm_mon]; t->tm_mday -= __spm[t->tm_mon];
++t->tm_mon; ++t->tm_mon;
if (t->tm_mon > 11) if (t->tm_mon > 11)
{ {
t->tm_mon = 0; t->tm_mon = 0;
++t->tm_year; ++t->tm_year;
} }
} }
if (t->tm_year < 70) if (t->tm_year < 70)
return (time_t) -1; return (time_t) - 1;
/* Days since 1970 is 365 * number of years + number of leap years since 1970 */ /* Days since 1970 is 365 * number of years + number of leap years since 1970 */
day = years * 365 + (years + 1) / 4; day = years * 365 + (years + 1) / 4;
/* After 2100 we have to substract 3 leap years for every 400 years /* After 2100 we have to substract 3 leap years for every 400 years
This is not intuitive. Most mktime implementations do not support This is not intuitive. Most mktime implementations do not support
dates after 2059, anyway, so we might leave this out for it's dates after 2059, anyway, so we might leave this out for it's
bloat. */ bloat. */
if (years >= 131) if (years >= 131)
{ {
years -= 131; years -= 131;
years /= 100; years /= 100;
day -= (years >> 2) * 3 + 1; day -= (years >> 2) * 3 + 1;
if ((years &= 3) == 3) if ((years &= 3) == 3)
years--; years--;
day -= years; day -= years;
} }
day += t->tm_yday = __spm[t->tm_mon] + t->tm_mday - 1 + day += t->tm_yday = __spm[t->tm_mon] + t->tm_mday - 1 +
(__isleap(t->tm_year + 1900) & (t->tm_mon > 1)); (__isleap(t->tm_year + 1900) & (t->tm_mon > 1));
/* day is now the number of days since 'Jan 1 1970' */ /* day is now the number of days since 'Jan 1 1970' */
i = 7; i = 7;
t->tm_wday = (day + 4) % i; /* Sunday=0, Monday=1, ..., Saturday=6 */ t->tm_wday = (day + 4) % i; /* Sunday=0, Monday=1, ..., Saturday=6 */
i = 24; i = 24;
day *= i; day *= i;
i = 60; i = 60;
return ((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec; return ((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec;
} }
static void num2str(char *c, int i) static void num2str(char *c, int i)
{ {
c[0] = i / 10 + '0'; c[0] = i / 10 + '0';
c[1] = i % 10 + '0'; c[1] = i % 10 + '0';
} }
char *asctime_r(const struct tm *t, char *buf) char *asctime_r(const struct tm *t, char *buf)
{ {
/* "Wed Jun 30 21:49:08 1993\n" */ /* "Wed Jun 30 21:49:08 1993\n" */
*(int*) buf = *(int*) (days + (t->tm_wday << 2)); *(int*) buf = *(int*) (days + (t->tm_wday << 2));
*(int*) (buf + 4) = *(int*) (months + (t->tm_mon << 2)); *(int*) (buf + 4) = *(int*) (months + (t->tm_mon << 2));
num2str(buf + 8, t->tm_mday); num2str(buf + 8, t->tm_mday);
if (buf[8] == '0') if (buf[8] == '0')
buf[8] = ' '; buf[8] = ' ';
buf[10] = ' '; buf[10] = ' ';
num2str(buf + 11, t->tm_hour); num2str(buf + 11, t->tm_hour);
buf[13] = ':'; buf[13] = ':';
num2str(buf + 14, t->tm_min); num2str(buf + 14, t->tm_min);
buf[16] = ':'; buf[16] = ':';
num2str(buf + 17, t->tm_sec); num2str(buf + 17, t->tm_sec);
buf[19] = ' '; buf[19] = ' ';
num2str(buf + 20, (t->tm_year + 1900) / 100); num2str(buf + 20, (t->tm_year + 1900) / 100);
num2str(buf + 22, (t->tm_year + 1900) % 100); num2str(buf + 22, (t->tm_year + 1900) % 100);
buf[24] = '\n'; buf[24] = '\n';
return buf; return buf;
} }
char *asctime(const struct tm *timeptr) char *asctime(const struct tm *timeptr)
{ {
static char buf[25]; static char buf[25];
return asctime_r(timeptr, buf); return asctime_r(timeptr, buf);
} }
char *ctime(const time_t *timep) char *ctime(const time_t *timep)
{ {
return asctime(localtime(timep)); return asctime(localtime(timep));
} }
#ifdef RT_USING_DEVICE #ifdef RT_USING_DEVICE
int gettimeofday(struct timeval *tp, void *ignore) int gettimeofday(struct timeval *tp, void *ignore)
{ {
time_t time; time_t time;
rt_device_t device; rt_device_t device;
device = rt_device_find("rtc"); device = rt_device_find("rtc");
RT_ASSERT(device != RT_NULL); RT_ASSERT(device != RT_NULL);
rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time); rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);