Skip to content

Commit

Permalink
Simplify PyInit_timezone. (GH-9323)
Browse files Browse the repository at this point in the history
Assume tzname exists. Only use a hack to compute altzone if it's not defined.
  • Loading branch information
benjaminp committed Sep 14, 2018
1 parent 24f6846 commit afde1c1
Showing 1 changed file with 15 additions and 68 deletions.
83 changes: 15 additions & 68 deletions Modules/timemodule.c
Expand Up @@ -1522,29 +1522,6 @@ PyDoc_STRVAR(get_clock_info_doc,
\n\
Get information of the specified clock.");

#if !defined(HAVE_TZNAME) || defined(__GLIBC__) || defined(__CYGWIN__)
static void
get_zone(char *zone, int n, struct tm *p)
{
#ifdef HAVE_STRUCT_TM_TM_ZONE
strncpy(zone, p->tm_zone ? p->tm_zone : " ", n);
#else
tzset();
strftime(zone, n, "%Z", p);
#endif
}

static int
get_gmtoff(time_t t, struct tm *p)
{
#ifdef HAVE_STRUCT_TM_TM_ZONE
return p->tm_gmtoff;
#else
return timegm(p) - t;
#endif
}
#endif /* !defined(HAVE_TZNAME) || defined(__GLIBC__) || defined(__CYGWIN__) */

static void
PyInit_timezone(PyObject *m) {
/* This code moved from PyInit_time wholesale to allow calling it from
Expand All @@ -1563,65 +1540,35 @@ PyInit_timezone(PyObject *m) {
And I'm lazy and hate C so nyer.
*/
#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
PyObject *otz0, *otz1;
tzset();
PyModule_AddIntConstant(m, "timezone", timezone);
#ifdef HAVE_ALTZONE
PyModule_AddIntConstant(m, "altzone", altzone);
#else
PyModule_AddIntConstant(m, "altzone", timezone-3600);
#endif
PyModule_AddIntConstant(m, "daylight", daylight);
otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape");
otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape");
PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1));
#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
#elif defined(HAVE_STRUCT_TM_TM_ZONE)
{
#define YEAR ((time_t)((365 * 24 + 6) * 3600))
static const time_t YEAR = (365 * 24 + 6) * 3600;
time_t t;
struct tm p;
long janzone, julyzone;
char janname[10], julyname[10];
t = (time((time_t *)0) / YEAR) * YEAR;
_PyTime_localtime(t, &p);
get_zone(janname, 9, &p);
janzone = -get_gmtoff(t, &p);
janname[9] = '\0';
janzone = -p.tm_gmtoff;
t += YEAR/2;
_PyTime_localtime(t, &p);
get_zone(julyname, 9, &p);
julyzone = -get_gmtoff(t, &p);
julyname[9] = '\0';

if( janzone < julyzone ) {
/* DST is reversed in the southern hemisphere */
PyModule_AddIntConstant(m, "timezone", julyzone);
PyModule_AddIntConstant(m, "altzone", janzone);
PyModule_AddIntConstant(m, "daylight",
janzone != julyzone);
PyModule_AddObject(m, "tzname",
Py_BuildValue("(zz)",
julyname, janname));
} else {
PyModule_AddIntConstant(m, "timezone", janzone);
PyModule_AddIntConstant(m, "altzone", julyzone);
PyModule_AddIntConstant(m, "daylight",
janzone != julyzone);
PyModule_AddObject(m, "tzname",
Py_BuildValue("(zz)",
janname, julyname));
}
julyzone = -p.tm_gmtoff;

// DST is reversed in the southern hemisphere.
PyModule_AddIntConstant(m, "altzone",
(janzone < julyzone) ? janzone : julyzone);
}
#ifdef __CYGWIN__
tzset();
PyModule_AddIntConstant(m, "timezone", _timezone);
PyModule_AddIntConstant(m, "altzone", _timezone-3600);
PyModule_AddIntConstant(m, "daylight", _daylight);
PyModule_AddObject(m, "tzname",
Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
#endif /* __CYGWIN__ */
#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
#else
PyModule_AddIntConstant(m, "altzone", timezone-3600);
#endif
PyModule_AddIntConstant(m, "daylight", daylight);
otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape");
otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape");
PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1));
}


Expand Down

0 comments on commit afde1c1

Please sign in to comment.