1 /* Copyright (C) 2002-2015 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <http://www.gnu.org/licenses/>. */
23 # define USE_IN_EXTENDED_LOCALE_MODEL 1
24 # define HAVE_LIMITS_H 1
26 # define HAVE_MBRLEN 1
27 # define HAVE_STRUCT_ERA_ENTRY 1
28 # define HAVE_TM_GMTOFF 1
29 # define HAVE_TM_ZONE 1
30 # define HAVE_TZNAME 1
32 # define HAVE_STRFTIME 0
33 # define MULTIBYTE_IS_FORMAT_SAFE 1
34 # define STDC_HEADERS 1
35 # include "../locale/localeinfo.h"
38 #if defined emacs && !defined HAVE_BCOPY
39 # define HAVE_MEMCPY 1
43 #include <sys/types.h> /* Some systems define `time_t' here. */
45 #ifdef TIME_WITH_SYS_TIME
46 # include <sys/time.h>
49 # ifdef HAVE_SYS_TIME_H
50 # include <sys/time.h>
56 extern char *tzname
[];
59 /* Do multibyte processing if multibytes are supported, unless
60 multibyte sequences are safe in formats. Multibyte sequences are
61 safe if they cannot contain byte sequences that look like format
62 conversion specifications. The GNU C Library uses UTF8 multibyte
63 encoding, which is safe for formats, but strftime.c can be used
64 with other C libraries that use unsafe encodings. */
65 #define DO_MULTIBYTE (HAVE_MBLEN && ! MULTIBYTE_IS_FORMAT_SAFE)
71 /* Simulate mbrlen with mblen as best we can. */
72 # define mbstate_t int
73 # define mbrlen(s, n, ps) mblen (s, n)
74 # define mbsinit(ps) (*(ps) == 0)
76 static const mbstate_t mbstate_zero
;
90 # define memcpy(d, s, n) bcopy ((s), (d), (n))
96 # define CHAR_T wchar_t
97 # define UCHAR_T unsigned int
98 # define L_(Str) L##Str
99 # define NLW(Sym) _NL_W##Sym
101 # define MEMCPY(d, s, n) __wmemcpy (d, s, n)
102 # define STRLEN(s) __wcslen (s)
106 # define UCHAR_T unsigned char
108 # define NLW(Sym) Sym
110 # if !defined STDC_HEADERS && !defined HAVE_MEMCPY
111 # define MEMCPY(d, s, n) bcopy ((s), (d), (n))
113 # define MEMCPY(d, s, n) memcpy ((d), (s), (n))
115 # define STRLEN(s) strlen (s)
118 # define MEMPCPY(d, s, n) __mempcpy (d, s, n)
120 # ifndef HAVE_MEMPCPY
121 # define MEMPCPY(d, s, n) ((void *) ((char *) memcpy (d, s, n) + (n)))
138 #define TYPE_SIGNED(t) ((t) -1 < 0)
140 /* Bound on length of the string representing an integer value of type t.
141 Subtract one for the sign bit if t is signed;
142 302 / 1000 is log10 (2) rounded up;
143 add one for integer division truncation;
144 add one more for a minus sign if t is signed. */
145 #define INT_STRLEN_BOUND(t) \
146 ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 + 1 + TYPE_SIGNED (t))
148 #define TM_YEAR_BASE 1900
151 /* Nonzero if YEAR is a leap year (every 4 years,
152 except every 100th isn't, and every 400th is). */
153 # define __isleap(year) \
154 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
159 # define tzname __tzname
160 # define tzset __tzset
164 /* Portable standalone applications should supply a "time_r.h" that
165 declares a POSIX-compliant localtime_r, for the benefit of older
166 implementations that lack localtime_r or have a nonstandard one.
167 Similarly for gmtime_r. See the gnulib time_r module for one way
168 to implement this. */
171 # undef __localtime_r
172 # define __gmtime_r gmtime_r
173 # define __localtime_r localtime_r
177 #if !defined memset && !defined HAVE_MEMSET && !defined _LIBC
178 /* Some systems lack the `memset' function and we don't want to
179 introduce additional dependencies. */
180 /* The SGI compiler reportedly barfs on the trailing null
181 if we use a string constant as the initializer. 28 June 1997, rms. */
182 static const CHAR_T spaces
[16] = /* " " */
184 L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),
185 L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' ')
187 static const CHAR_T zeroes
[16] = /* "0000000000000000" */
189 L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),
190 L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0')
193 # define memset_space(P, Len) \
199 int _this = _len > 16 ? 16 : _len; \
200 (P) = MEMPCPY ((P), spaces, _this * sizeof (CHAR_T)); \
206 # define memset_zero(P, Len) \
212 int _this = _len > 16 ? 16 : _len; \
213 (P) = MEMPCPY ((P), zeroes, _this * sizeof (CHAR_T)); \
220 # define memset_space(P, Len) (wmemset ((P), L' ', (Len)), (P) += (Len))
221 # define memset_zero(P, Len) (wmemset ((P), L'0', (Len)), (P) += (Len))
223 # define memset_space(P, Len) (memset ((P), ' ', (Len)), (P) += (Len))
224 # define memset_zero(P, Len) (memset ((P), '0', (Len)), (P) += (Len))
232 int _delta = width - _n; \
233 int _incr = _n + (_delta > 0 ? _delta : 0); \
234 if ((size_t) _incr >= maxsize - i) \
240 if (pad == L_('0')) \
241 memset_zero (p, _delta); \
243 memset_space (p, _delta); \
254 memcpy_lowcase (p, (s), _n LOCALE_ARG); \
255 else if (to_uppcase) \
256 memcpy_uppcase (p, (s), _n LOCALE_ARG); \
258 MEMCPY ((PTR) p, (const PTR) (s), _n))
261 # ifndef USE_IN_EXTENDED_LOCALE_MODEL
262 # undef __mbsrtowcs_l
263 # define __mbsrtowcs_l(d, s, l, st, loc) __mbsrtowcs (d, s, l, st)
265 # define widen(os, ws, l) \
268 const char *__s = os; \
269 memset (&__st, '\0', sizeof (__st)); \
270 l = __mbsrtowcs_l (NULL, &__s, 0, &__st, loc); \
271 ws = alloca ((l + 1) * sizeof (wchar_t)); \
272 (void) __mbsrtowcs_l (ws, &__s, l, &__st, loc); \
277 #if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL
278 /* We use this code also for the extended locale handling where the
279 function gets as an additional argument the locale which has to be
280 used. To access the values we have to redefine the _NL_CURRENT
282 # define strftime __strftime_l
283 # define wcsftime __wcsftime_l
285 # define _NL_CURRENT(category, item) \
286 (current->values[_NL_ITEM_INDEX (item)].string)
287 # define LOCALE_PARAM , loc
288 # define LOCALE_ARG , loc
289 # define LOCALE_PARAM_DECL __locale_t loc;
290 # define LOCALE_PARAM_PROTO , __locale_t loc
291 # define HELPER_LOCALE_ARG , current
293 # define LOCALE_PARAM
294 # define LOCALE_PARAM_PROTO
296 # define LOCALE_PARAM_DECL
298 # define HELPER_LOCALE_ARG , _NL_CURRENT_DATA (LC_TIME)
300 # define HELPER_LOCALE_ARG
305 # ifdef USE_IN_EXTENDED_LOCALE_MODEL
306 # define TOUPPER(Ch, L) __towupper_l (Ch, L)
307 # define TOLOWER(Ch, L) __towlower_l (Ch, L)
309 # define TOUPPER(Ch, L) towupper (Ch)
310 # define TOLOWER(Ch, L) towlower (Ch)
314 # ifdef USE_IN_EXTENDED_LOCALE_MODEL
315 # define TOUPPER(Ch, L) __toupper_l (Ch, L)
316 # define TOLOWER(Ch, L) __tolower_l (Ch, L)
318 # define TOUPPER(Ch, L) toupper (Ch)
319 # define TOLOWER(Ch, L) tolower (Ch)
322 # define TOUPPER(Ch, L) (islower (Ch) ? toupper (Ch) : (Ch))
323 # define TOLOWER(Ch, L) (isupper (Ch) ? tolower (Ch) : (Ch))
326 /* We don't use `isdigit' here since the locale dependent
327 interpretation is not what we want here. We only need to accept
328 the arabic digits in the ASCII range. One day there is perhaps a
329 more reliable way to accept other sets of digits. */
330 #define ISDIGIT(Ch) ((unsigned int) (Ch) - L_('0') <= 9)
332 static CHAR_T
*memcpy_lowcase (CHAR_T
*dest
, const CHAR_T
*src
,
333 size_t len LOCALE_PARAM_PROTO
) __THROW
;
336 memcpy_lowcase (dest
, src
, len LOCALE_PARAM
)
343 dest
[len
] = TOLOWER ((UCHAR_T
) src
[len
], loc
);
347 static CHAR_T
*memcpy_uppcase (CHAR_T
*dest
, const CHAR_T
*src
,
348 size_t len LOCALE_PARAM_PROTO
) __THROW
;
351 memcpy_uppcase (dest
, src
, len LOCALE_PARAM
)
358 dest
[len
] = TOUPPER ((UCHAR_T
) src
[len
], loc
);
364 /* Yield the difference between *A and *B,
365 measured in seconds, ignoring leap seconds. */
366 # define tm_diff ftime_tm_diff
367 static int tm_diff (const struct tm
*, const struct tm
*) __THROW
;
373 /* Compute intervening leap days correctly even if year is negative.
374 Take care to avoid int overflow in leap day calculations,
375 but it's OK to assume that A and B are close to each other. */
376 int a4
= (a
->tm_year
>> 2) + (TM_YEAR_BASE
>> 2) - ! (a
->tm_year
& 3);
377 int b4
= (b
->tm_year
>> 2) + (TM_YEAR_BASE
>> 2) - ! (b
->tm_year
& 3);
378 int a100
= a4
/ 25 - (a4
% 25 < 0);
379 int b100
= b4
/ 25 - (b4
% 25 < 0);
380 int a400
= a100
>> 2;
381 int b400
= b100
>> 2;
382 int intervening_leap_days
= (a4
- b4
) - (a100
- b100
) + (a400
- b400
);
383 int years
= a
->tm_year
- b
->tm_year
;
384 int days
= (365 * years
+ intervening_leap_days
385 + (a
->tm_yday
- b
->tm_yday
));
386 return (60 * (60 * (24 * days
+ (a
->tm_hour
- b
->tm_hour
))
387 + (a
->tm_min
- b
->tm_min
))
388 + (a
->tm_sec
- b
->tm_sec
));
390 #endif /* ! HAVE_TM_GMTOFF */
394 /* The number of days from the first day of the first ISO week of this
395 year to the year day YDAY with week day WDAY. ISO weeks start on
396 Monday; the first ISO week has the year's first Thursday. YDAY may
397 be as small as YDAY_MINIMUM. */
398 #define ISO_WEEK_START_WDAY 1 /* Monday */
399 #define ISO_WEEK1_WDAY 4 /* Thursday */
400 #define YDAY_MINIMUM (-366)
401 static int iso_week_days (int, int) __THROW
;
406 iso_week_days (yday
, wday
)
410 /* Add enough to the first operand of % to make it nonnegative. */
411 int big_enough_multiple_of_7
= (-YDAY_MINIMUM
/ 7 + 2) * 7;
413 - (yday
- wday
+ ISO_WEEK1_WDAY
+ big_enough_multiple_of_7
) % 7
414 + ISO_WEEK1_WDAY
- ISO_WEEK_START_WDAY
);
418 #if !(defined _NL_CURRENT || HAVE_STRFTIME)
419 static CHAR_T
const weekday_name
[][10] =
421 L_("Sunday"), L_("Monday"), L_("Tuesday"), L_("Wednesday"),
422 L_("Thursday"), L_("Friday"), L_("Saturday")
424 static CHAR_T
const month_name
[][10] =
426 L_("January"), L_("February"), L_("March"), L_("April"), L_("May"),
427 L_("June"), L_("July"), L_("August"), L_("September"), L_("October"),
428 L_("November"), L_("December")
434 # define my_strftime emacs_strftimeu
435 # define ut_argument , ut
436 # define ut_argument_spec int ut;
437 # define ut_argument_spec_iso , int ut
440 # define my_strftime wcsftime
441 # define nl_get_alt_digit _nl_get_walt_digit
443 # define my_strftime strftime
444 # define nl_get_alt_digit _nl_get_alt_digit
447 # define ut_argument_spec
448 # define ut_argument_spec_iso
449 /* We don't have this information in general. */
453 static size_t __strftime_internal (CHAR_T
*, size_t, const CHAR_T
*,
454 const struct tm
*, bool *
456 LOCALE_PARAM_PROTO
) __THROW
;
458 /* Write information from TP into S according to the format
459 string FORMAT, writing no more that MAXSIZE characters
460 (including the terminating '\0') and returning number of
461 characters written. If S is NULL, nothing will be written
462 anywhere, so to determine how many characters would be
463 written, use NULL for S and (size_t) UINT_MAX for MAXSIZE. */
466 my_strftime (s
, maxsize
, format
, tp ut_argument LOCALE_PARAM
)
469 const CHAR_T
*format
;
474 #if !defined _LIBC && HAVE_TZNAME && HAVE_TZSET
475 /* Solaris 2.5 tzset sometimes modifies the storage returned by localtime.
476 Work around this bug by copying *tp before it might be munged. */
481 bool tzset_called
= false;
482 return __strftime_internal (s
, maxsize
, format
, tp
, &tzset_called
483 ut_argument LOCALE_ARG
);
486 libc_hidden_def (my_strftime
)
490 __strftime_internal (s
, maxsize
, format
, tp
, tzset_called ut_argument
494 const CHAR_T
*format
;
500 #if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL
501 struct __locale_data
*const current
= loc
->__locales
[LC_TIME
];
504 int hour12
= tp
->tm_hour
;
506 /* We cannot make the following values variables since we must delay
507 the evaluation of these values until really needed since some
508 expressions might not be valid in every situation. The `struct tm'
509 might be generated by a strptime() call that initialized
510 only a few elements. Dereference the pointers only if the format
511 requires this. Then it is ok to fail if the pointers are invalid. */
513 ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))
515 ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday))
517 ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))
519 ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon))
521 ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11 \
522 ? NLW(PM_STR) : NLW(AM_STR)))
524 # define aw_len STRLEN (a_wkday)
525 # define am_len STRLEN (a_month)
526 # define ap_len STRLEN (ampm)
529 # define f_wkday (weekday_name[tp->tm_wday])
530 # define f_month (month_name[tp->tm_mon])
531 # define a_wkday f_wkday
532 # define a_month f_month
533 # define ampm (L_("AMPM") + 2 * (tp->tm_hour > 11))
544 #if DO_MULTIBYTE && !defined COMPILE_WIDE
545 const char *format_end
= NULL
;
550 /* The POSIX test suite assumes that setting
551 the environment variable TZ to a new value before calling strftime()
552 will influence the result (the %Z format) even if the information in
553 TP is computed with a totally different time zone.
554 This is bogus: though POSIX allows bad behavior like this,
555 POSIX does not require it. Do the right thing instead. */
556 zone
= (const char *) tp
->tm_zone
;
561 if (! (zone
&& *zone
))
572 for (f
= format
; *f
!= '\0'; ++f
)
574 int pad
= 0; /* Padding for number ('-', '_', or 0). */
575 int modifier
; /* Field modifier ('E', 'O', or 0). */
576 int digits
; /* Max digits for numeric format. */
577 int number_value
; /* Numeric value to be printed. */
578 int negative_number
; /* 1 if the number is negative. */
579 const CHAR_T
*subfmt
;
581 CHAR_T buf
[1 + (sizeof (int) < sizeof (time_t)
582 ? INT_STRLEN_BOUND (time_t)
583 : INT_STRLEN_BOUND (int))];
590 #if DO_MULTIBYTE && !defined COMPILE_WIDE
596 case L_('\b'): case L_('\t'): case L_('\n'):
597 case L_('\v'): case L_('\f'): case L_('\r'):
598 case L_(' '): case L_('!'): case L_('"'): case L_('#'): case L_('&'):
599 case L_('\''): case L_('('): case L_(')'): case L_('*'): case L_('+'):
600 case L_(','): case L_('-'): case L_('.'): case L_('/'): case L_('0'):
601 case L_('1'): case L_('2'): case L_('3'): case L_('4'): case L_('5'):
602 case L_('6'): case L_('7'): case L_('8'): case L_('9'): case L_(':'):
603 case L_(';'): case L_('<'): case L_('='): case L_('>'): case L_('?'):
604 case L_('A'): case L_('B'): case L_('C'): case L_('D'): case L_('E'):
605 case L_('F'): case L_('G'): case L_('H'): case L_('I'): case L_('J'):
606 case L_('K'): case L_('L'): case L_('M'): case L_('N'): case L_('O'):
607 case L_('P'): case L_('Q'): case L_('R'): case L_('S'): case L_('T'):
608 case L_('U'): case L_('V'): case L_('W'): case L_('X'): case L_('Y'):
609 case L_('Z'): case L_('['): case L_('\\'): case L_(']'): case L_('^'):
610 case L_('_'): case L_('a'): case L_('b'): case L_('c'): case L_('d'):
611 case L_('e'): case L_('f'): case L_('g'): case L_('h'): case L_('i'):
612 case L_('j'): case L_('k'): case L_('l'): case L_('m'): case L_('n'):
613 case L_('o'): case L_('p'): case L_('q'): case L_('r'): case L_('s'):
614 case L_('t'): case L_('u'): case L_('v'): case L_('w'): case L_('x'):
615 case L_('y'): case L_('z'): case L_('{'): case L_('|'): case L_('}'):
617 /* The C Standard requires these 98 characters (plus '%') to
618 be in the basic execution character set. None of these
619 characters can start a multibyte sequence, so they need
620 not be analyzed further. */
625 /* Copy this multibyte sequence until we reach its end, find
626 an error, or come back to the initial shift state. */
628 mbstate_t mbstate
= mbstate_zero
;
633 format_end
= f
+ strlen (f
) + 1;
634 fsize
= format_end
- f
;
638 size_t bytes
= mbrlen (f
+ len
, fsize
- len
, &mbstate
);
643 if (bytes
== (size_t) -2)
645 len
+= strlen (f
+ len
);
649 if (bytes
== (size_t) -1)
657 while (! mbsinit (&mbstate
));
665 #else /* ! DO_MULTIBYTE */
667 /* Either multibyte encodings are not supported, they are
668 safe for formats, so any non-'%' byte can be copied through,
669 or this is the wide character version. */
676 #endif /* ! DO_MULTIBYTE */
678 /* Check for flags that can modify a format. */
683 /* This influences the number formats. */
690 /* This changes textual output. */
704 /* As a GNU extension we allow to specify the field width. */
710 if (width
> INT_MAX
/ 10
711 || (width
== INT_MAX
/ 10 && *f
- L_('0') > INT_MAX
% 10))
712 /* Avoid overflow. */
717 width
+= *f
- L_('0');
721 while (ISDIGIT (*f
));
724 /* Check for modifiers. */
737 /* Now do the specified format. */
741 #define DO_NUMBER(d, v) \
742 digits = d > width ? d : width; \
743 number_value = v; goto do_number
744 #define DO_NUMBER_SPACEPAD(d, v) \
745 digits = d > width ? d : width; \
746 number_value = v; goto do_number_spacepad
762 #if defined _NL_CURRENT || !HAVE_STRFTIME
763 cpy (aw_len
, a_wkday
);
766 goto underlying_strftime
;
777 #if defined _NL_CURRENT || !HAVE_STRFTIME
778 cpy (STRLEN (f_wkday
), f_wkday
);
781 goto underlying_strftime
;
793 #if defined _NL_CURRENT || !HAVE_STRFTIME
794 cpy (am_len
, a_month
);
797 goto underlying_strftime
;
808 #if defined _NL_CURRENT || !HAVE_STRFTIME
809 cpy (STRLEN (f_month
), f_month
);
812 goto underlying_strftime
;
816 if (modifier
== L_('O'))
819 if (! (modifier
== 'E'
821 (const CHAR_T
*) _NL_CURRENT (LC_TIME
,
824 subfmt
= (const CHAR_T
*) _NL_CURRENT (LC_TIME
, NLW(D_T_FMT
));
827 goto underlying_strftime
;
829 subfmt
= L_("%a %b %e %H:%M:%S %Y");
835 CHAR_T
*old_start
= p
;
836 size_t len
= __strftime_internal (NULL
, (size_t) -1, subfmt
,
837 tp
, tzset_called ut_argument
839 add (len
, __strftime_internal (p
, maxsize
- i
, subfmt
,
840 tp
, tzset_called ut_argument
844 while (old_start
< p
)
846 *old_start
= TOUPPER ((UCHAR_T
) *old_start
, loc
);
852 #if HAVE_STRFTIME && ! (defined _NL_CURRENT && HAVE_STRUCT_ERA_ENTRY)
855 /* The relevant information is available only via the
856 underlying strftime implementation, so use that. */
859 char ubuf
[1024]; /* enough for any single format in practice */
861 /* Make sure we're calling the actual underlying strftime.
862 In some cases, config.h contains something like
863 "#define strftime rpl_strftime". */
874 len
= strftime (ubuf
, sizeof ubuf
, ufmt
, tp
);
875 if (len
== 0 && ubuf
[0] != '\0')
883 if (modifier
== L_('E'))
885 #if HAVE_STRUCT_ERA_ENTRY
886 struct era_entry
*era
= _nl_get_era_entry (tp HELPER_LOCALE_ARG
);
890 size_t len
= __wcslen (era
->era_wname
);
891 cpy (len
, era
->era_wname
);
893 size_t len
= strlen (era
->era_name
);
894 cpy (len
, era
->era_name
);
900 goto underlying_strftime
;
906 int year
= tp
->tm_year
+ TM_YEAR_BASE
;
907 DO_NUMBER (1, year
/ 100 - (year
% 100 < 0));
911 if (modifier
== L_('O'))
914 if (! (modifier
== L_('E')
916 (const CHAR_T
*)_NL_CURRENT (LC_TIME
, NLW(ERA_D_FMT
)))
918 subfmt
= (const CHAR_T
*) _NL_CURRENT (LC_TIME
, NLW(D_FMT
));
922 goto underlying_strftime
;
930 subfmt
= L_("%m/%d/%y");
934 if (modifier
== L_('E'))
937 DO_NUMBER (2, tp
->tm_mday
);
940 if (modifier
== L_('E'))
943 DO_NUMBER_SPACEPAD (2, tp
->tm_mday
);
945 /* All numeric formats set DIGITS and NUMBER_VALUE and then
946 jump to one of these two labels. */
949 /* Force `_' flag unless overwritten by `0' or '-' flag. */
950 if (pad
!= L_('0') && pad
!= L_('-'))
954 /* Format the number according to the MODIFIER flag. */
956 if (modifier
== L_('O') && 0 <= number_value
)
959 /* Get the locale specific alternate representation of
960 the number NUMBER_VALUE. If none exist NULL is returned. */
961 const CHAR_T
*cp
= nl_get_alt_digit (number_value
966 size_t digitlen
= STRLEN (cp
);
975 goto underlying_strftime
;
980 unsigned int u
= number_value
;
982 bufp
= buf
+ sizeof (buf
) / sizeof (buf
[0]);
983 negative_number
= number_value
< 0;
989 *--bufp
= u
% 10 + L_('0');
990 while ((u
/= 10) != 0);
993 do_number_sign_and_padding
:
999 int padding
= digits
- (buf
+ (sizeof (buf
) / sizeof (buf
[0]))
1006 if ((size_t) padding
>= maxsize
- i
)
1010 memset_space (p
, padding
);
1012 width
= width
> padding
? width
- padding
: 0;
1016 if ((size_t) digits
>= maxsize
- i
)
1019 if (negative_number
)
1029 memset_zero (p
, padding
);
1036 cpy (buf
+ sizeof (buf
) / sizeof (buf
[0]) - bufp
, bufp
);
1042 subfmt
= L_("%Y-%m-%d");
1046 if (modifier
== L_('E'))
1049 DO_NUMBER (2, tp
->tm_hour
);
1052 if (modifier
== L_('E'))
1055 DO_NUMBER (2, hour12
);
1057 case L_('k'): /* GNU extension. */
1058 if (modifier
== L_('E'))
1061 DO_NUMBER_SPACEPAD (2, tp
->tm_hour
);
1063 case L_('l'): /* GNU extension. */
1064 if (modifier
== L_('E'))
1067 DO_NUMBER_SPACEPAD (2, hour12
);
1070 if (modifier
== L_('E'))
1073 DO_NUMBER (3, 1 + tp
->tm_yday
);
1076 if (modifier
== L_('E'))
1079 DO_NUMBER (2, tp
->tm_min
);
1082 if (modifier
== L_('E'))
1085 DO_NUMBER (2, tp
->tm_mon
+ 1);
1088 add (1, *p
= L_('\n'));
1093 #if !defined _NL_CURRENT && HAVE_STRFTIME
1094 format_char
= L_('p');
1104 #if defined _NL_CURRENT || !HAVE_STRFTIME
1108 goto underlying_strftime
;
1112 subfmt
= L_("%H:%M");
1116 #if !defined _NL_CURRENT && HAVE_STRFTIME
1117 goto underlying_strftime
;
1120 if (*(subfmt
= (const CHAR_T
*) _NL_CURRENT (LC_TIME
,
1124 subfmt
= L_("%I:%M:%S %p");
1129 if (modifier
== L_('E'))
1132 DO_NUMBER (2, tp
->tm_sec
);
1134 case L_('s'): /* GNU extension. */
1142 /* Generate string value for T using time_t arithmetic;
1143 this works even if sizeof (long) < sizeof (time_t). */
1145 bufp
= buf
+ sizeof (buf
) / sizeof (buf
[0]);
1146 negative_number
= t
< 0;
1153 if (negative_number
)
1157 /* Adjust if division truncates to minus infinity. */
1158 if (0 < -1 % 10 && d
< 0)
1165 *--bufp
= d
+ L_('0');
1170 goto do_number_sign_and_padding
;
1174 if (modifier
== L_('O'))
1177 if (! (modifier
== L_('E')
1179 (const CHAR_T
*) _NL_CURRENT (LC_TIME
, NLW(ERA_T_FMT
)))
1181 subfmt
= (const CHAR_T
*) _NL_CURRENT (LC_TIME
, NLW(T_FMT
));
1185 goto underlying_strftime
;
1191 subfmt
= L_("%H:%M:%S");
1195 add (1, *p
= L_('\t'));
1199 DO_NUMBER (1, (tp
->tm_wday
- 1 + 7) % 7 + 1);
1202 if (modifier
== L_('E'))
1205 DO_NUMBER (2, (tp
->tm_yday
- tp
->tm_wday
+ 7) / 7);
1210 if (modifier
== L_('E'))
1213 int year
= tp
->tm_year
+ TM_YEAR_BASE
;
1214 int days
= iso_week_days (tp
->tm_yday
, tp
->tm_wday
);
1218 /* This ISO week belongs to the previous year. */
1220 days
= iso_week_days (tp
->tm_yday
+ (365 + __isleap (year
)),
1225 int d
= iso_week_days (tp
->tm_yday
- (365 + __isleap (year
)),
1229 /* This ISO week belongs to the next year. */
1238 DO_NUMBER (2, (year
% 100 + 100) % 100);
1241 DO_NUMBER (1, year
);
1244 DO_NUMBER (2, days
/ 7 + 1);
1249 if (modifier
== L_('E'))
1252 DO_NUMBER (2, (tp
->tm_yday
- (tp
->tm_wday
- 1 + 7) % 7 + 7) / 7);
1255 if (modifier
== L_('E'))
1258 DO_NUMBER (1, tp
->tm_wday
);
1261 if (modifier
== 'E')
1263 #if HAVE_STRUCT_ERA_ENTRY
1264 struct era_entry
*era
= _nl_get_era_entry (tp HELPER_LOCALE_ARG
);
1267 # ifdef COMPILE_WIDE
1268 subfmt
= era
->era_wformat
;
1270 subfmt
= era
->era_format
;
1276 goto underlying_strftime
;
1280 if (modifier
== L_('O'))
1283 DO_NUMBER (1, tp
->tm_year
+ TM_YEAR_BASE
);
1286 if (modifier
== L_('E'))
1288 #if HAVE_STRUCT_ERA_ENTRY
1289 struct era_entry
*era
= _nl_get_era_entry (tp HELPER_LOCALE_ARG
);
1292 int delta
= tp
->tm_year
- era
->start_date
[0];
1293 DO_NUMBER (1, (era
->offset
1294 + delta
* era
->absolute_direction
));
1298 goto underlying_strftime
;
1302 DO_NUMBER (2, (tp
->tm_year
% 100 + 100) % 100);
1312 /* The tzset() call might have changed the value. */
1313 if (!(zone
&& *zone
) && tp
->tm_isdst
>= 0)
1315 /* POSIX.1 requires that local time zone information is used as
1316 though strftime called tzset. */
1321 *tzset_called
= true;
1324 zone
= tzname
[tp
->tm_isdst
];
1332 /* The zone string is always given in multibyte form. We have
1333 to transform it first. */
1336 widen (zone
, wczone
, len
);
1340 cpy (strlen (zone
), zone
);
1345 if (tp
->tm_isdst
< 0)
1351 diff
= tp
->tm_gmtoff
;
1361 /* POSIX.1 requires that local time zone information is used as
1362 though strftime called tzset. */
1367 *tzset_called
= true;
1374 if (lt
== (time_t) -1)
1376 /* mktime returns -1 for errors, but -1 is also a
1377 valid time_t value. Check whether an error really
1381 if (! __localtime_r (<
, &tm
)
1382 || ((ltm
.tm_sec
^ tm
.tm_sec
)
1383 | (ltm
.tm_min
^ tm
.tm_min
)
1384 | (ltm
.tm_hour
^ tm
.tm_hour
)
1385 | (ltm
.tm_mday
^ tm
.tm_mday
)
1386 | (ltm
.tm_mon
^ tm
.tm_mon
)
1387 | (ltm
.tm_year
^ tm
.tm_year
)))
1391 if (! __gmtime_r (<
, >m
))
1394 diff
= tm_diff (<m
, >m
);
1400 add (1, *p
= L_('-'));
1404 add (1, *p
= L_('+'));
1407 DO_NUMBER (4, (diff
/ 60) * 100 + diff
% 60);
1410 case L_('\0'): /* GNU extension: % at end of format. */
1414 /* Unknown format; output the format, including the '%',
1415 since this is most likely the right thing to do if a
1416 multibyte string has been misparsed. */
1420 for (flen
= 1; f
[1 - flen
] != L_('%'); flen
++)
1422 cpy (flen
, &f
[1 - flen
]);
1428 if (p
&& maxsize
!= 0)
1435 /* For Emacs we have a separate interface which corresponds to the normal
1436 strftime function and does not have the extra information whether the
1437 TP arguments comes from a `gmtime' call or not. */
1439 emacs_strftime (s
, maxsize
, format
, tp
)
1443 const struct tm
*tp
;
1445 return my_strftime (s
, maxsize
, format
, tp
, 0);
1449 #if defined _LIBC && !defined COMPILE_WIDE
1450 weak_alias (__strftime_l
, strftime_l
)