strftime improvements

Corinna Vinschen
Fri Feb 18 09:38:00 GMT 2005


On Feb 16 16:18, Jeff Johnston wrote:
> Patch checked in.  I made two minor changes to remove some compiler 
> warnings I was getting.  They may already have been there before the patch.

the below patch breaks building Cygwin.  The reason is that strftime
now references the external symbol __tzrule from tzset_r.c.  While
Cygwin uses newlib's strftime, it doesn't use newlib's tzset implementation.
The Cygwin implementation, introduced by DJ Delorie in 1999, supports
getting timezone information from Windows as well as reading the zoneinfo
file, so we don't want to switch over to newlib's tzset implementation.

Unfortunately, since referencing __tzrule pulls in tzset_r.o when
linking, we're now getting multiple defined symbols.

To solve this problem, we can either eliminate using __tzrule from strftime,
or Cygwin could provide a __tzrule.  The latter seems to make more sense,
so I've implemented providing __tzrule in our own implementation, though
with only the offset member having a useful meaning.

The problem here is, that the datatype of __tzrule has to be identical to
the implementation in newlib.  But the definition of the type __tzrule_type
is unfortunately local to newlib/libc/time.  That requires to duplicate
the definition locally in Cygwin which is a mess if the definition in
newlib changes for some reason.

So the question is, can we move the definition of __tzrule_type to a header
file which is accessible from Cygwin, e.g. sys/time.h or sys/types.h ?


> Eric Blake wrote:
> >Following up to my post last month about broken strftime(3), here is a
> >patch that implements all the remaining missing functionality required by
> >POSIX, as well as improving the documentation.
> >
> >Note that there are still some useful non-POSIX extensions out there that
> >might be worth implementing.  In glibc, strftime(NULL, (size_t)UINT_MAX,
> >format, &tm) returns the number of characters that would be placed into a
> >non-NULL string, great for allocating a string to have exact length.  And
> >in Solaris, strftime(s, len, NULL, &tm) uses "%c" as the default format.
> >
> >Also, something I did not know how to fix - POSIX requires that <time.h>
> >include extern int daylight, extern long timezone, and extern char
> >*tzname.  But as currently written, <time.h> has daylight and tzname
> >exposed only under __CYGWIN__, and timezone is a function instead of a
> >long unless timezonevar is defined.
> >
> >2005-02-14  Eric Blake  <>
> >
> >	* libc/time/time.tex: Improve the documentation.
> >	* libc/time/strftime.c: Improve the documentation.
> >	(iso_year_adjust): New helper function.
> >	(strftime): Simplify '%E' and '%O'. Change '%c' to use
> >	recursion. Fix '%C', '%y', and '%Y' to deal with years with more
> >	than 4 characters.  Combine '%d' and '%e'. Implement '%D', '%F',
> >	'%g', '%G', '%n', '%R', '%t', '%T', '%u', '%V', '%X', and '%z'.
> >	Avoid core dumps on valid inputs (maxsize == 0, or
> >	tim_p->tm_isdst > 1).
> >

Corinna Vinschen
Cygwin Project Co-Leader
Red Hat, Inc.

More information about the Newlib mailing list