/* Time zone functions such as tzalloc and localtime_rz
- Copyright 2015 Free Software Foundation, Inc.
+ Copyright 2015-2016 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
}
/* Return a newly allocated time zone for NAME, or NULL on failure.
- As a special case, return a nonzero constant for wall clock time, a
- constant that survives freeing. */
+ A null NAME stands for wall clock time (which is like unset TZ). */
timezone_t
tzalloc (char const *name)
{
tz->tzname_copy[0] = tz->tzname_copy[1] = NULL;
#endif
tz->tz_is_set = !!name;
- extend_abbrs (tz->abbrs, name, name_size);
+ tz->abbrs[0] = '\0';
+ if (name)
+ extend_abbrs (tz->abbrs, name, name_size);
}
return tz;
}
timezone_t old_tz = set_tz (tz);
if (old_tz)
{
- tm = localtime_r (t, tm);
- if (tm && !save_abbr (tz, tm))
- tm = NULL;
- if (revert_tz (old_tz))
+ bool abbr_saved = localtime_r (t, tm) && save_abbr (tz, tm);
+ if (revert_tz (old_tz) && abbr_saved)
return tm;
}
return NULL;