bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: bug in newlib strftime


From: Jeff Johnston
Subject: Re: bug in newlib strftime
Date: Thu, 20 Jan 2005 14:14:16 -0500
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1

I am looking into the changes requested below and should have something checked in by end of day.

-- Jeff J.

Eric Blake wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Newlib has several POSIX compliance issues in strftime().  See
http://www.opengroup.org/onlinepubs/009695399/functions/strftime.html for
the mandated behavior.  Since newlib does not support any locales other
than "C", strftime() should be fixed to follow the mandated behavior.  The
broken behavior of strftime() leads to failures in the coreutils program
date on cygwin and any other newlib-based platform.

Should coreutils add a configure-time check that looks for broken
strftime(), or should I just wait for a new version of newlib that fixes
the compliance issues?

In newlib, strftime() treats "%r" as "", although Posix requires it to be
a synonym for "%I:%M:%S %p" in the POSIX/C locale.  Likewise, newlib
treats "%x" as "%a %b %d %Y", although Posix mandates "%m/%d/%y".
Finally, newlib does not support the %E or %O modifiers, even though Posix
mandates that they be ignored for the conversion specifiers that support
them (in other words, "%Ey", "%Oy", and "%y" are all required and should
behave identically in the "C" locale, but since "%Ea" is not required, its
behavior is undefined).  In the sample program below, the two output lines
should be identical.

$ cat foo.c
#include <time.h>
#include <stdlib.h>
#include <locale.h>

#define MAX_LEN 80

int main()
{
  char str[MAX_LEN];
  struct tm t;
  setlocale(LC_ALL, "C");
  memset(&t, 0, sizeof(t));
  t.tm_sec = 30;
  t.tm_min = 15;
  t.tm_hour = 1; /* 1:15:30 AM */
  t.tm_mday = 18; /* 18th */
  t.tm_mon = 0; /* Jan */
  t.tm_year = 105; /* 2005 */
  t.tm_wday = 2; /* Tue */
  strftime(str, MAX_LEN, "%r#%x#%Ey#%Oy", &t);
  puts(str);
  strftime(str, MAX_LEN, "%I:%M:%S %p#%m/%d/%y#%y#%y", &t);
  puts(str);
  return 0;
}
$ gcc -o foo foo.c
$ ./foo
#Tue Jan 18 2005#y#y
01:15:30 AM#01/18/05#05#05

- --
Life is short - so eat dessert first!

Eric Blake             address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (Cygwin)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFB7mKr84KuGfSFAYARAjNdAKCjNw/IWf0ZxBMvHsAo6dm/T2gwogCfWjyK
4H/w5oTgp9MOZ/nZSTUYp5A=
=OA+F
-----END PGP SIGNATURE-----





reply via email to

[Prev in Thread] Current Thread [Next in Thread]