提交 c5c956a8 编写于 作者: B bernard.xiong@gmail.com

rewrite gettimeofday in minilibc.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1096 bbd45198-f89e-11dd-88c7-29a3b14d5316
上级 bc6e8c54
...@@ -23,72 +23,105 @@ static const char months[] = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec "; ...@@ -23,72 +23,105 @@ static const char months[] = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ";
/* seconds per day */ /* seconds per day */
#define SPD 24*60*60 #define SPD 24*60*60
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; work/=60; r->tm_sec = work % 60;
r->tm_min=work%60; r->tm_hour=work/60; work /= 60;
work=*timep/(SPD); r->tm_min = work % 60;
r->tm_wday=(4+work)%7; r->tm_hour = work / 60;
for (i=1970; ; ++i) { work = *timep / (SPD);
register time_t k=__isleap(i)?366:365; r->tm_wday = (4 + work) % 7;
if (work>=k) for (i = 1970;; ++i)
work-=k; {
register time_t k = __isleap(i) ? 366 : 365;
if (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) r->tm_mday=2; /* 29.2. */ {
work-=1; if (work == 59)
r->tm_mday = 2; /* 29.2. */
work -= 1;
} }
for (i=11; i && (__spm[i]>work); --i) ; for (i = 11; i && (__spm[i] > work); --i)
r->tm_mon=i; ;
r->tm_mday+=work-__spm[i]; r->tm_mon = 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; struct timezone tz;
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 timegm(struct tm *const t) { time_t timegm(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) { t->tm_min += t->tm_sec/60; t->tm_sec%=60; } if (t->tm_sec > 60)
if (t->tm_min>60) { t->tm_hour += t->tm_min/60; t->tm_min%=60; } {
if (t->tm_hour>24) { t->tm_mday += t->tm_hour/24; t->tm_hour%=24; } t->tm_min += t->tm_sec / 60;
if (t->tm_mon>12) { t->tm_year += t->tm_mon/12; t->tm_mon%=12; } t->tm_sec %= 60;
while (t->tm_mday>__spm[1+t->tm_mon]) { }
if (t->tm_mon==1 && __isleap(t->tm_year+1900)) { if (t->tm_min > 60)
{
t->tm_hour += t->tm_min / 60;
t->tm_min %= 60;
}
if (t->tm_hour > 24)
{
t->tm_mday += t->tm_hour / 24;
t->tm_hour %= 24;
}
if (t->tm_mon > 12)
{
t->tm_year += t->tm_mon / 12;
t->tm_mon %= 12;
}
while (t->tm_mday > __spm[1 + t->tm_mon])
{
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) { t->tm_mon=0; ++t->tm_year; } if (t->tm_mon > 11)
{
t->tm_mon = 0;
++t->tm_year;
}
} }
if (t->tm_year < 70) if (t->tm_year < 70)
...@@ -101,14 +134,17 @@ time_t timegm(struct tm *const t) { ...@@ -101,14 +134,17 @@ time_t timegm(struct tm *const t) {
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) >= 0) { if ((years -= 131) >= 0)
{
years /= 100; years /= 100;
day -= (years >> 2) * 3 + 1; day -= (years >> 2) * 3 + 1;
if ((years &= 3) == 3) years--; if ((years &= 3) == 3)
years--;
day -= years; day -= years;
} }
day += t->tm_yday = __spm [t->tm_mon] + t->tm_mday-1 + ( __isleap (t->tm_year+1900) & (t->tm_mon > 1) ); day += t->tm_yday = __spm[t->tm_mon] + t->tm_mday - 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;
...@@ -120,54 +156,71 @@ time_t timegm(struct tm *const t) { ...@@ -120,54 +156,71 @@ time_t timegm(struct tm *const t) {
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;
} }
time_t mktime(register struct tm* const t) { time_t mktime(register struct tm* const t)
time_t x=timegm(t); {
time_t x = timegm(t);
struct timezone tz; struct timezone tz;
gettimeofday(0, &tz); gettimeofday(0, &tz);
timezone=tz.tz_minuteswest*60L; timezone = tz.tz_minuteswest * 60L;
x+=timezone; x += timezone;
return x; return x;
} }
static void num2str(char *c,int i) { static void num2str(char *c, int i)
c[0]=i/10+'0'; {
c[1]=i%10+'0'; c[0] = 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') buf[8]=' '; if (buf[8] == '0')
buf[10]=' '; buf[8] = ' ';
num2str(buf+11,t->tm_hour); buf[10] = ' ';
buf[13]=':'; num2str(buf + 11, t->tm_hour);
num2str(buf+14,t->tm_min); buf[13] = ':';
buf[16]=':'; num2str(buf + 14, t->tm_min);
num2str(buf+17,t->tm_sec); buf[16] = ':';
buf[19]=' '; num2str(buf + 17, t->tm_sec);
num2str(buf+20,(t->tm_year+1900)/100); buf[19] = ' ';
num2str(buf+22,(t->tm_year+1900)%100); num2str(buf + 20, (t->tm_year + 1900) / 100);
buf[24]='\n'; num2str(buf + 22, (t->tm_year + 1900) % 100);
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));
} }
int gettimeofday (struct timeval *tp, void *ignore) int gettimeofday(struct timeval *tp, void *ignore)
{ {
time_t t; time_t time;
rt_device_t device;
t = time(NULL);
tp->tv_sec = t; device = rt_device_find("rtc");
if (device != RT_NULL)
{
rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
if (tp != RT_NULL)
{
tp->tv_sec = time;
tp->tv_usec = 0; tp->tv_usec = 0;
}
return time;
}
return 0; return 0;
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册