strftime improvements

Jeff Johnston jjohnstn@redhat.com
Fri Feb 18 19:49:00 GMT 2005


Corinna Vinschen wrote:
> Jeff,
> 
> 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 ?
>

I have no problem with moving the type into sys/types.h, but I would like to 
suggest a further change as well.  I would like to see the definition moved into 
a separate file with an access function (e.g. __get_tzrule_ptr()) .  Each 
libc/time function needing access would fetch the address dynamically and there 
wouldn't be a global variable.  If you don't have time to do this, I'll do it, 
but it affects your code on the other side in Cygwin.

-- Jeff J.

> 
> Thanks,
> Corinna
> 
> 
> 
>>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  <ebb9@byu.net>
>>>
>>>	* 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).
>>>
> 
> 



More information about the Newlib mailing list