* free so as not to pull it into static programs. Growth
* strategy makes it so free would have minimal benefit anyway. */
i = strlen(s);
- if (i > PATH_MAX+1) s = "", i = 0;
+ if (i > PATH_MAX+1) s = __gmt, i = 3;
if (i >= old_tz_size) {
old_tz_size *= 2;
if (i >= old_tz_size) old_tz_size = i+1;
break;
memcpy(pathname, s, l+1);
pathname[l] = 0;
- for (try=search; !map && *try; try+=l) {
+ for (try=search; !map && *try; try+=l+1) {
l = strlen(try);
memcpy(pathname-l, try, l);
map = __map_file(pathname-l, &map_size);
if (map) {
int scale = 2;
if (sizeof(time_t) > 4 && map[4]=='2') {
- size_t skip = zi_dotprod(zi, VEC(1,1,8,5,6,1), 6);
- trans = zi+skip+44+20;
+ size_t skip = zi_dotprod(zi+20, VEC(1,1,8,5,6,1), 6);
+ trans = zi+skip+44+44;
scale++;
} else {
trans = zi+44;
for (s = (const char *)zi+map_size-2; *s!='\n'; s--);
s++;
} else {
- s = 0;
+ const unsigned char *p;
+ __tzname[0] = __tzname[1] = 0;
+ __daylight = __timezone = dst_off = 0;
+ for (i=0; i<5; i++) r0[i] = r1[i] = 0;
+ for (p=types; p<abbrevs; p+=6) {
+ if (!p[4] && !__tzname[0]) {
+ __tzname[0] = (char *)abbrevs + p[5];
+ __timezone = -zi_read32(p);
+ }
+ if (p[4] && !__tzname[1]) {
+ __tzname[1] = (char *)abbrevs + p[5];
+ dst_off = -zi_read32(p);
+ __daylight = 1;
+ }
+ }
+ if (!__tzname[0]) __tzname[0] = __tzname[1];
+ if (!__tzname[0]) __tzname[0] = (char *)__gmt;
+ if (!__daylight) {
+ __tzname[1] = __tzname[0];
+ dst_off = __timezone;
+ }
+ return;
}
}
const void *p = tm->__tm_zone;
LOCK(lock);
do_tzset();
- if (p != __gmt && p != __tzname[0] && p != __tzname[1]
- && (uintptr_t)p-(uintptr_t)abbrevs >= abbrevs_end - abbrevs)
+ if (p != __gmt && p != __tzname[0] && p != __tzname[1] &&
+ (!zi || (uintptr_t)p-(uintptr_t)abbrevs >= abbrevs_end - abbrevs))
p = "";
UNLOCK(lock);
return p;