size_t fprintftime (FILE *fp, char const *fmt, struct tm const *tm,
int utc, int nanoseconds);
Background:
date should not have to allocate a megabyte of virtual memory to
handle a format argument like +%1048575T. When implemented with
strftime, it must allocate such a buffer, use strftime to fill it
in, print it, then free it.
With fprintftime, it simply prints everything and exits.
With no need for memory allocation, that's one fewer way to fail.
number and when used with a zero-padded field width, e.g. %015s.
(my_strftime): Move the `do_number_sign_and_padding'
label so that it precedes the code to set `digits'. Otherwise,
%0Ns wouldn't work. Before this change, `date -d @-22 +%05s' would
print `00-22'. Now, it prints `-0022', as it should.
(my_strftime): Do not mishandle years close to INT_MAX, by doing
the right thing even if adding 1900 would overflow. Similarly
for tm_mon + 1 and tm_yday + 1.
Make %Y always equivalent to %C%y, and similarly for %G and %g.
(DO_NUMBER, DO_NUMBER_SPACEPAD): Set digits to d, not a conditional.
(DO_SIGNED_NUMBER): New macro.
(my_strftime) [HAVE_TZNAME]: Don't dump core if tp->tm_dst > 1.
(my_strftime) [!_LIBC && HAVE_TZNAME && HAVE_TZSET]:
Remove function, now that we can rely on a working tzset function.
Ensure that the required autoconf test has been run.
(nl_get_alt_digit) [! defined my_strftime]: Define.
(my_strftime) [_NL_CURRENT]: Merge nearly-identical uses of
_nl_get_alt_digit and _nl_get_walt_digit.
Define to nstrftime if emacs, but only if my_strftime is not defined.
(extra_args, extra_args_spec, extra_args_spec_iso): Rename from
ut_argument, ut_argument_spec, ut_argument_spec_iso, respectively.
Add one more extra argument: a nanoseconds value.
All uses changed.
(ns): New macro.
(my_strftime function): Add %N format.
(emacs_strftimeu): Renamed from emacs_strftime,
with extra ut argument.
library's localtime_r and gmtime_r; there are too many buggy
implementations of localtime_r and gmtime_r out there, and
it's not worth keeping track of all the different bugs.
* strftime.c (__EXTENSIONS__): Remove.
(my_strftime_gmtime_r): Renamed from gmtime_r; all uses changed.
(my_strftime_localtime_r): Renamed from localtime_r; all uses changed.
Base them on localtime/gmtime if not _LIBC.