ruby-changes:16270
From: akr <ko1@a...>
Date: Wed, 9 Jun 2010 22:54:17 +0900 (JST)
Subject: [ruby-changes:16270] Ruby:r28238 (trunk): * time.c (find_time_t): always outerpolate from past.
akr 2010-06-09 22:54:03 +0900 (Wed, 09 Jun 2010) New Revision: 28238 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28238 Log: * time.c (find_time_t): always outerpolate from past. [ruby-core:30672] reported by Benoit Daloze. Modified files: trunk/ChangeLog trunk/time.c Index: time.c =================================================================== --- time.c (revision 28237) +++ time.c (revision 28238) @@ -2674,6 +2674,7 @@ int find_dst; struct tm result; int status; + int tptr_tm_yday; #define GUESS(p) (DEBUG_FIND_TIME_NUMGUESS_INC (utc_p ? gmtime_with_leapsecond(p, &result) : LOCALTIME(p, result))) @@ -2901,23 +2902,31 @@ } } /* Given argument has no corresponding time_t. Let's outerpolation. */ - if (tm_lo.tm_year == tptr->tm_year && tm_lo.tm_mon == tptr->tm_mon) { - *tp = guess_lo + - (tptr->tm_mday - tm_lo.tm_mday) * 24 * 60 * 60 + - (tptr->tm_hour - tm_lo.tm_hour) * 60 * 60 + - (tptr->tm_min - tm_lo.tm_min) * 60 + - (tptr->tm_sec - tm_lo.tm_sec); - return NULL; - } - else if (tm_hi.tm_year == tptr->tm_year && tm_hi.tm_mon == tptr->tm_mon) { - *tp = guess_hi + - (tptr->tm_mday - tm_hi.tm_mday) * 24 * 60 * 60 + - (tptr->tm_hour - tm_hi.tm_hour) * 60 * 60 + - (tptr->tm_min - tm_hi.tm_min) * 60 + - (tptr->tm_sec - tm_hi.tm_sec); - return NULL; - } + /* + * `Seconds Since the Epoch' in SUSv3: + * tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 + + * (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 - + * ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400 + */ + tptr_tm_yday = calc_tm_yday(tptr->tm_year, tptr->tm_mon, tptr->tm_mday); + + *tp = guess_lo + + ((tptr->tm_year - tm_lo.tm_year) * 365 + + ((tptr->tm_year-69)/4) - + ((tptr->tm_year-1)/100) + + ((tptr->tm_year+299)/400) - + ((tm_lo.tm_year-69)/4) + + ((tm_lo.tm_year-1)/100) - + ((tm_lo.tm_year+299)/400) + + tptr_tm_yday - + tm_lo.tm_yday) * 86400 + + (tptr->tm_hour - tm_lo.tm_hour) * 3600 + + (tptr->tm_min - tm_lo.tm_min) * 60 + + (tptr->tm_sec - tm_lo.tm_sec); + + return NULL; + out_of_range: return "time out of range"; Index: ChangeLog =================================================================== --- ChangeLog (revision 28237) +++ ChangeLog (revision 28238) @@ -1,3 +1,8 @@ +Wed Jun 9 22:51:50 2010 Tanaka Akira <akr@f...> + + * time.c (find_time_t): always outerpolate from past. + [ruby-core:30672] reported by Benoit Daloze. + Wed Jun 9 22:13:08 2010 Tanaka Akira <akr@f...> * time.c (calc_tm_yday): extracted from timegmw_noleapsecond. -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/