diff options
author | Benjamin Peterson <benjamin@python.org> | 2018-09-14 23:21:32 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-14 23:21:32 (GMT) |
commit | afde1c1a05cc8a1e8adf6403c451f6708509a605 (patch) | |
tree | e64657c0d9359e6bd0ceb85faa00c7cca009a314 | |
parent | 24f684692070f53b6f6e4dc67b9fe23dbd58655f (diff) | |
download | cpython-afde1c1a05cc8a1e8adf6403c451f6708509a605.zip cpython-afde1c1a05cc8a1e8adf6403c451f6708509a605.tar.gz cpython-afde1c1a05cc8a1e8adf6403c451f6708509a605.tar.bz2 |
Simplify PyInit_timezone. (GH-9323)
Assume tzname exists. Only use a hack to compute altzone if it's not defined.
-rw-r--r-- | Modules/timemodule.c | 83 |
1 files changed, 15 insertions, 68 deletions
diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 1a4cff2..b9a71b4 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -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 @@ -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)); } |