* libc/time/strftime.c (__strftime): Utilize __TM_GMTOFF and __TM_ZONE
on systems where available. On Cygwin, call function to get values. Add comment to explain why. Drop TZ_LOCK/TZ_UNLOCK in 'z' case since it's not necessary. In 'Z' case, add a comment to document a potential codeset problem.
This commit is contained in:
parent
fc55214612
commit
808fde520f
|
@ -1,3 +1,11 @@
|
||||||
|
2015-01-08 Corinna Vinschen <vinschen@redhat.com>
|
||||||
|
|
||||||
|
* libc/time/strftime.c (__strftime): Utilize __TM_GMTOFF and __TM_ZONE
|
||||||
|
on systems where available. On Cygwin, call function to get values.
|
||||||
|
Add comment to explain why. Drop TZ_LOCK/TZ_UNLOCK in 'z' case since
|
||||||
|
it's not necessary. In 'Z' case, add a comment to document a potential
|
||||||
|
codeset problem.
|
||||||
|
|
||||||
2015-01-08 Renlin Li <renlin.li@arm.com>
|
2015-01-08 Renlin Li <renlin.li@arm.com>
|
||||||
|
|
||||||
* testsuite/newlib.wctype/twctrans.c (main): Use towlower and towupper.
|
* testsuite/newlib.wctype/twctrans.c (main): Use towlower and towupper.
|
||||||
|
|
|
@ -1283,13 +1283,24 @@ recurse:
|
||||||
if (tim_p->tm_isdst >= 0)
|
if (tim_p->tm_isdst >= 0)
|
||||||
{
|
{
|
||||||
long offset;
|
long offset;
|
||||||
|
|
||||||
|
#if defined (__CYGWIN__)
|
||||||
|
/* Cygwin must check if the application has been built with or
|
||||||
|
without the extra tm members for backward compatibility, and
|
||||||
|
then use either that or the old method fetching from tzinfo.
|
||||||
|
Rather than pulling in the version check infrastructure, we
|
||||||
|
just call a Cygwin function. */
|
||||||
|
extern long __cygwin_gettzoffset (const struct tm *tmp);
|
||||||
|
offset = __cygwin_gettzoffset (tim_p);
|
||||||
|
#elif defined (__TM_GMTOFF)
|
||||||
|
offset = tim_p->__TM_GMTOFF;
|
||||||
|
#else
|
||||||
__tzinfo_type *tz = __gettzinfo ();
|
__tzinfo_type *tz = __gettzinfo ();
|
||||||
TZ_LOCK;
|
|
||||||
/* The sign of this is exactly opposite the envvar TZ. We
|
/* The sign of this is exactly opposite the envvar TZ. We
|
||||||
could directly use the global _timezone for tm_isdst==0,
|
could directly use the global _timezone for tm_isdst==0,
|
||||||
but have to use __tzrule for daylight savings. */
|
but have to use __tzrule for daylight savings. */
|
||||||
offset = -tz->__tzrule[tim_p->tm_isdst > 0].offset;
|
offset = -tz->__tzrule[tim_p->tm_isdst > 0].offset;
|
||||||
TZ_UNLOCK;
|
#endif
|
||||||
len = snprintf (&s[count], maxsize - count, CQ("%+03ld%.2ld"),
|
len = snprintf (&s[count], maxsize - count, CQ("%+03ld%.2ld"),
|
||||||
offset / SECSPERHOUR,
|
offset / SECSPERHOUR,
|
||||||
labs (offset / SECSPERMIN) % 60L);
|
labs (offset / SECSPERMIN) % 60L);
|
||||||
|
@ -1300,12 +1311,27 @@ recurse:
|
||||||
if (tim_p->tm_isdst >= 0)
|
if (tim_p->tm_isdst >= 0)
|
||||||
{
|
{
|
||||||
size_t size;
|
size_t size;
|
||||||
|
const char *tznam;
|
||||||
|
|
||||||
TZ_LOCK;
|
TZ_LOCK;
|
||||||
size = strlen(_tzname[tim_p->tm_isdst > 0]);
|
#if defined (__CYGWIN__)
|
||||||
|
/* See above. */
|
||||||
|
extern const char *__cygwin_gettzname (const struct tm *tmp);
|
||||||
|
tznam = __cygwin_gettzname (tim_p);
|
||||||
|
#elif defined (__TM_ZONE)
|
||||||
|
tznam = tim_p->__TM_ZONE;
|
||||||
|
#else
|
||||||
|
tznam = _tzname[tim_p->tm_isdst > 0];
|
||||||
|
#endif
|
||||||
|
/* Note that in case of wcsftime this loop only works for
|
||||||
|
timezone abbreviations using the portable codeset (aka ASCII).
|
||||||
|
This seems to be the case, but if that ever changes, this
|
||||||
|
loop needs revisiting. */
|
||||||
|
size = strlen (tznam);
|
||||||
for (i = 0; i < size; i++)
|
for (i = 0; i < size; i++)
|
||||||
{
|
{
|
||||||
if (count < maxsize - 1)
|
if (count < maxsize - 1)
|
||||||
s[count++] = _tzname[tim_p->tm_isdst > 0][i];
|
s[count++] = tznam[i];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TZ_UNLOCK;
|
TZ_UNLOCK;
|
||||||
|
|
Loading…
Reference in New Issue