Now that silly season seems to be over, two reruns. First, changes to localtime.c (both attached and below, with tabs mangled).<br>These are designed to address two issues noted earlier this year by Doug Bailey: ensuring that "tzname" values are set, and<br>
getting proper behavior when the software is being run on an unsigned-time_t system but is using data files generated on a<br>signed-time_t system. These changes have been updated to be relative to tz2012j.<br><br> --ado<br>
<br>*** tz2012j/localtime.c 2012-10-26 20:37:42.000000000 -0400<br>--- tznew/localtime.c 2012-11-25 16:11:23.833188100 -0500<br>***************<br>*** 271,276 ****<br>--- 271,281 ----<br> /*<br> ** And to get the latest zone names into tzname. . .<br>
*/<br>+ for (i = 0; i < sp->typecnt; ++i) {<br>+ register const struct ttinfo * const ttisp = &sp->ttis[i];<br>+ <br>+ tzname[ttisp->tt_isdst] = &sp->chars[ttisp->tt_abbrind];<br>
+ } <br> for (i = 0; i < sp->timecnt; ++i) {<br> register const struct ttinfo * const ttisp =<br> &sp->ttis[<br>***************<br>*** 479,498 ****<br> ** signed time_t system but using a data file with<br>
** unsigned values (or vice versa).<br> */<br>! for (i = 0; i < sp->timecnt - 2; ++i)<br>! if (sp->ats[i] > sp->ats[i + 1]) {<br>! ++i;<br> if (TYPE_SIGNED(time_t)) {<br>
/*<br> ** Ignore the end (easy).<br> */<br>! sp->timecnt = i;<br> } else {<br> /*<br> ** Ignore the beginning (harder).<br>
*/<br> register int j;<br> <br> for (j = 0; j + i < sp->timecnt; ++j) {<br> sp->ats[j] = sp->ats[j + i];<br> sp->types[j] = sp->types[j + i];<br>
--- 484,514 ----<br> ** signed time_t system but using a data file with<br> ** unsigned values (or vice versa).<br> */<br>! for (i = 0; i < sp->timecnt; ++i)<br>! if ((i < sp->timecnt - 1 &&<br>
! sp->ats[i] > sp->ats[i + 1]) ||<br>! (i == sp->timecnt - 1 && !TYPE_SIGNED(time_t) &&<br>! sp->ats[i] ><br>! ((stored == 4) ? INT32_MAX : INT64_MAX))) {<br>
if (TYPE_SIGNED(time_t)) {<br> /*<br> ** Ignore the end (easy).<br> */<br>! sp->timecnt = i + 1;<br> } else {<br>
/*<br> ** Ignore the beginning (harder).<br> */<br> register int j;<br> <br>+ /*<br>+ ** Keep the record right before the<br>
+ ** epoch boundary,<br>+ ** but tweak it so that it starts<br>+ ** right with the epoch<br>+ ** (thanks to Doug Bailey).<br>+ */<br>
+ sp->ats[i] = 0;<br> for (j = 0; j + i < sp->timecnt; ++j) {<br> sp->ats[j] = sp->ats[j + i];<br> sp->types[j] = sp->types[j + i];<br>
<br>