A possibility mentioned last year at the time of the Macquarie fix: here's a more general fix for zic.c. For clarity, it comes in two pieces. This first piece simply rolls back the Macquarie-specific changes to zic.c; it's both attached and appears in mangled form below. These changes are relative to the git repository version. @dashdashado 1.1 2838 lines 1.2 2805 lines *** /tmp/,azic.c 2014-05-01 01:51:26.531315400 -0400 --- /tmp/,bzic.c 2014-05-01 01:51:26.640515600 -0400 *************** *** 1480,1490 **** fromi = 0; while (fromi < timecnt && attypes[fromi].at < min_time) ++fromi; ! /* ! ** Remember that type 0 is reserved. ! */ ! if (isdsts[1] == 0) ! while (fromi < timecnt && attypes[fromi].type == 1) ++fromi; /* handled by default rule */ for ( ; fromi < timecnt; ++fromi) { if (toi != 0 && ((attypes[fromi].at + --- 1480,1487 ---- fromi = 0; while (fromi < timecnt && attypes[fromi].at < min_time) ++fromi; ! if (isdsts[0] == 0) ! while (fromi < timecnt && attypes[fromi].type == 0) ++fromi; /* handled by default rule */ for ( ; fromi < timecnt; ++fromi) { if (toi != 0 && ((attypes[fromi].at + *************** *** 1589,1599 **** } thistimelim = thistimei + thistimecnt; thisleaplim = thisleapi + thisleapcnt; ! /* ! ** Remember that type 0 is reserved. ! */ ! writetype[0] = FALSE; ! for (i = 1; i < typecnt; ++i) writetype[i] = thistimecnt == timecnt; if (thistimecnt == 0) { /* --- 1586,1592 ---- } thistimelim = thistimei + thistimecnt; thisleaplim = thisleapi + thisleapcnt; ! for (i = 0; i < typecnt; ++i) writetype[i] = thistimecnt == timecnt; if (thistimecnt == 0) { /* *************** *** 1609,1619 **** /* ** For America/Godthab and Antarctica/Palmer */ - /* - ** Remember that type 0 is reserved. - */ if (thistimei == 0) ! writetype[1] = TRUE; } #ifndef LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH /* --- 1602,1609 ---- /* ** For America/Godthab and Antarctica/Palmer */ if (thistimei == 0) ! writetype[0] = TRUE; } #ifndef LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH /* *************** *** 1663,1688 **** } #endif /* !defined LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH */ thistypecnt = 0; - /* - ** Potentially, set type 0 to that of lowest-valued time. - */ - if (thistimei > 0) { - for (i = 1; i < typecnt; ++i) - if (writetype[i] && !isdsts[i]) - break; - if (i != types[thistimei - 1]) { - i = types[thistimei - 1]; - gmtoffs[0] = gmtoffs[i]; - isdsts[0] = isdsts[i]; - ttisstds[0] = ttisstds[i]; - ttisgmts[0] = ttisgmts[i]; - abbrinds[0] = abbrinds[i]; - writetype[0] = TRUE; - writetype[i] = FALSE; - } - } for (i = 0; i < typecnt; ++i) ! typemap[i] = writetype[i] ? thistypecnt++ : 0; for (i = 0; i < sizeof indmap / sizeof indmap[0]; ++i) indmap[i] = -1; thischarcnt = 0; --- 1653,1660 ---- } #endif /* !defined LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH */ thistypecnt = 0; for (i = 0; i < typecnt; ++i) ! typemap[i] = writetype[i] ? thistypecnt++ : -1; for (i = 0; i < sizeof indmap / sizeof indmap[0]; ++i) indmap[i] = -1; thischarcnt = 0; *************** *** 2105,2115 **** updateminmax(leapminyear); updateminmax(leapmaxyear + (leapmaxyear < ZIC_MAX)); } - /* - ** Reserve type 0. - */ - gmtoffs[0] = isdsts[0] = ttisstds[0] = ttisgmts[0] = abbrinds[0] = -1; - typecnt = 1; for (i = 0; i < zonecount; ++i) { zp = &zpfirst[i]; if (i < zonecount - 1) --- 2077,2082 ----