mirror of
https://https.git.savannah.gnu.org/git/gnulib.git
synced 2026-04-28 22:53:36 +00:00
* lib/tzset.c (tzset): Elaborate comment, based on explanations by Paul Eggert. * lib/ctime.c (rpl_ctime): Likewise. * lib/localtime.c (rpl_localtime): Likewise. * lib/mktime.c (mktime): Likewise. * lib/strftime-fixes.c (rpl_strftime): Likewise. * lib/wcsftime.c (rpl_wcsftime): Likewise.
61 lines
2.6 KiB
C
61 lines
2.6 KiB
C
/* Work around platform bugs in wcsftime.
|
|
Copyright (C) 2017 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 <http://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 __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://msdn.microsoft.com/en-us/library/90s5c885.aspx>
|
|
- 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
|
|
<http://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);
|
|
}
|