bug in newlib strftime

Jeff Johnston jjohnstn@redhat.com
Thu Jan 20 19:14:00 GMT 2005


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             ebb9@byu.net
> -----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-----



More information about the Newlib mailing list