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