| /* Work around platform bugs in wcsftime. |
| Copyright (C) 2017-2020 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 |
| the Free Software Foundation; either version 3 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program. If not, see <https://www.gnu.org/licenses/>. */ |
| |
| #include <config.h> |
| |
| /* Specification. */ |
| #include <wchar.h> |
| |
| #include <stdlib.h> |
| #include <string.h> |
| #include <time.h> |
| |
| #undef wcsftime |
| |
| size_t |
| rpl_wcsftime (wchar_t *buf, size_t bufsize, const wchar_t *format, const struct tm *tp) |
| { |
| #if defined _WIN32 && ! defined __CYGWIN__ |
| /* Rectify the value of the environment variable TZ. |
| There are four possible kinds of such values: |
| - Traditional US time zone names, e.g. "PST8PDT". Syntax: see |
| <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/tzset> |
| - Time zone names based on geography, that contain one or more |
| slashes, e.g. "Europe/Moscow". |
| - Time zone names based on geography, without slashes, e.g. |
| "Singapore". |
| - Time zone names that contain explicit DST rules. Syntax: see |
| <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03> |
| The Microsoft CRT understands only the first kind. It produces incorrect |
| results if the value of TZ is of the other kinds. |
| But in a Cygwin environment, /etc/profile.d/tzset.sh sets TZ to a value |
| of the second kind for most geographies, or of the first kind in a few |
| other geographies. If it is of the second kind, neutralize it. For the |
| Microsoft CRT, an absent or empty TZ means the time zone that the user |
| has set in the Windows Control Panel. |
| If the value of TZ is of the third or fourth kind -- Cygwin programs |
| understand these syntaxes as well --, it does not matter whether we |
| neutralize it or not, since these values occur only when a Cygwin user |
| has set TZ explicitly; this case is 1. rare and 2. under the user's |
| responsibility. */ |
| const char *tz = getenv ("TZ"); |
| if (tz != NULL && strchr (tz, '/') != NULL) |
| _putenv ("TZ="); |
| #endif |
| |
| return wcsftime (buf, bufsize, format, tp); |
| } |