1 /* Copyright (C) 1991, 92, 93, 94, 95, 96 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 Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 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 Library General Public License for more details.
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB. If not,
16 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 Boston, MA 02111-1307, USA. */
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 MULTIBYTE_IS_FORMAT_SAFE 1
33 # define STDC_HEADERS 1
34 # include <ansidecl.h>
35 # include "../locale/localeinfo.h"
39 #include <sys/types.h> /* Some systems define `time_t' here. */
41 #ifdef TIME_WITH_SYS_TIME
42 # include <sys/time.h>
45 # ifdef HAVE_SYS_TIME_H
46 # include <sys/time.h>
52 extern char *tzname[];
55 /* Do multibyte processing if multibytes are supported, unless
56 multibyte sequences are safe in formats. Multibyte sequences are
57 safe if they cannot contain byte sequences that look like format
58 conversion specifications. The GNU C Library uses UTF8 multibyte
59 encoding, which is safe for formats, but strftime.c can be used
60 with other C libraries that use unsafe encodings. */
61 #define DO_MULTIBYTE (HAVE_MBLEN && ! MULTIBYTE_IS_FORMAT_SAFE)
67 /* Simulate mbrlen with mblen as best we can. */
68 # define mbstate_t int
69 # define mbrlen(s, n, ps) mblen (s, n)
70 # define mbsinit(ps) (*(ps) == 0)
72 static const mbstate_t mbstate_zero;
84 # define memcpy(d, s, n) bcopy ((s), (d), (n))
88 # if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
89 # define __P(args) args
111 #define TYPE_SIGNED(t) ((t) -1 < 0)
113 /* Bound on length of the string representing an integer value of type t.
114 Subtract one for the sign bit if t is signed;
115 302 / 1000 is log10 (2) rounded up;
116 add one for integer division truncation;
117 add one more for a minus sign if t is signed. */
118 #define INT_STRLEN_BOUND(t) \
119 ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 100 + 1 + TYPE_SIGNED (t))
121 #define TM_YEAR_BASE 1900
124 /* Nonzero if YEAR is a leap year (every 4 years,
125 except every 100th isn't, and every 400th is). */
126 # define __isleap(year) \
127 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
132 # define gmtime_r __gmtime_r
133 # define localtime_r __localtime_r
134 extern int __tz_compute __P ((time_t timer, const struct tm *tm));
135 # define tzname __tzname
136 # define tzset __tzset
138 # if ! HAVE_LOCALTIME_R
139 # if ! HAVE_TM_GMTOFF
140 /* Approximate gmtime_r as best we can in its absence. */
141 # define gmtime_r my_gmtime_r
142 static struct tm *gmtime_r __P ((const time_t *, struct tm *));
148 struct tm *l = gmtime (t);
154 # endif /* ! HAVE_TM_GMTOFF */
156 /* Approximate localtime_r as best we can in its absence. */
157 # define localtime_r my_localtime_r
158 static struct tm *localtime_r __P ((const time_t *, struct tm *));
164 struct tm *l = localtime (t);
170 # endif /* ! HAVE_LOCALTIME_R */
171 #endif /* ! defined (_LIBC) */
174 #if !defined (memset) && !defined (HAVE_MEMSET) && !defined (_LIBC)
175 /* Some systems lack the `memset' function and we don't want to
176 introduce additional dependencies. */
177 static const char spaces[16] = " ";
179 # define memset_space(P, Len) \
185 int _this = _len > 16 ? 16 : _len; \
186 memcpy ((P), spaces, _this); \
193 # define memset_space(P, Len) memset ((P), ' ', (Len))
200 int _delta = width - _n; \
201 int _incr = _n + (_delta > 0 ? _delta : 0); \
202 if (i + _incr >= maxsize) \
207 memset_space (p, _delta); \
217 memcpy_lowcase (p, (s), _n); \
218 else if (to_uppcase) \
219 memcpy_uppcase (p, (s), _n); \
221 memcpy ((PTR) p, (PTR) (s), _n))
226 # define TOUPPER(Ch) toupper (Ch)
227 # define TOLOWER(Ch) tolower (Ch)
229 # define TOUPPER(Ch) (islower (Ch) ? toupper (Ch) : (Ch))
230 # define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
232 /* We don't use `isdigit' here since the locale dependent
233 interpretation is not what we want here. We only need to accept
234 the arabic digits in the ASCII range. One day there is perhaps a
235 more reliable way to accept other sets of digits. */
236 #define ISDIGIT(Ch) ((unsigned int) (Ch) - '0' <= 9)
238 static char *memcpy_lowcase __P ((char *dest, const char *src, size_t len));
241 memcpy_lowcase (dest, src, len)
247 dest[len] = TOLOWER (src[len]);
251 static char *memcpy_uppcase __P ((char *dest, const char *src, size_t len));
254 memcpy_uppcase (dest, src, len)
260 dest[len] = TOUPPER (src[len]);
265 /* Yield the difference between *A and *B,
266 measured in seconds, ignoring leap seconds. */
267 static int tm_diff __P ((const struct tm *, const struct tm *));
273 /* Compute intervening leap days correctly even if year is negative.
274 Take care to avoid int overflow in leap day calculations,
275 but it's OK to assume that A and B are close to each other. */
276 int a4 = (a->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (a->tm_year & 3);
277 int b4 = (b->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (b->tm_year & 3);
278 int a100 = a4 / 25 - (a4 % 25 < 0);
279 int b100 = b4 / 25 - (b4 % 25 < 0);
280 int a400 = a100 >> 2;
281 int b400 = b100 >> 2;
282 int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
283 int years = a->tm_year - b->tm_year;
284 int days = (365 * years + intervening_leap_days
285 + (a->tm_yday - b->tm_yday));
286 return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
287 + (a->tm_min - b->tm_min))
288 + (a->tm_sec - b->tm_sec));
290 #endif /* ! HAVE_TM_GMTOFF */
294 /* The number of days from the first day of the first ISO week of this
295 year to the year day YDAY with week day WDAY. ISO weeks start on
296 Monday; the first ISO week has the year's first Thursday. YDAY may
297 be as small as YDAY_MINIMUM. */
298 #define ISO_WEEK_START_WDAY 1 /* Monday */
299 #define ISO_WEEK1_WDAY 4 /* Thursday */
300 #define YDAY_MINIMUM (-366)
301 static int iso_week_days __P ((int, int));
306 iso_week_days (yday, wday)
310 /* Add enough to the first operand of % to make it nonnegative. */
311 int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7;
313 - (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7
314 + ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY);
319 static char const weekday_name[][10] =
321 "Sunday", "Monday", "Tuesday", "Wednesday",
322 "Thursday", "Friday", "Saturday"
324 static char const month_name[][10] =
326 "January", "February", "March", "April", "May", "June",
327 "July", "August", "September", "October", "November", "December"
331 /* Write information from TP into S according to the format
332 string FORMAT, writing no more that MAXSIZE characters
333 (including the terminating '\0') and returning number of
334 characters written. If S is NULL, nothing will be written
335 anywhere, so to determine how many characters would be
336 written, use NULL for S and (size_t) UINT_MAX for MAXSIZE. */
338 strftime (s, maxsize, format, tp)
344 int hour12 = tp->tm_hour;
346 const char *const a_wkday = _NL_CURRENT (LC_TIME, ABDAY_1 + tp->tm_wday);
347 const char *const f_wkday = _NL_CURRENT (LC_TIME, DAY_1 + tp->tm_wday);
348 const char *const a_month = _NL_CURRENT (LC_TIME, ABMON_1 + tp->tm_mon);
349 const char *const f_month = _NL_CURRENT (LC_TIME, MON_1 + tp->tm_mon);
350 const char *const ampm = _NL_CURRENT (LC_TIME,
351 hour12 > 11 ? PM_STR : AM_STR);
352 size_t aw_len = strlen (a_wkday);
353 size_t am_len = strlen (a_month);
354 size_t ap_len = strlen (ampm);
356 const char *const f_wkday = weekday_name[tp->tm_wday];
357 const char *const f_month = month_name[tp->tm_mon];
358 const char *const a_wkday = f_wkday;
359 const char *const a_month = f_month;
360 const char *const ampm = "AMPM" + 2 * (hour12 > 11);
365 size_t wkday_len = strlen (f_wkday);
366 size_t month_len = strlen (f_month);
374 #if !defined _LIBC && HAVE_TM_ZONE
375 /* XXX We have some problems here. First, the string pointed to by
376 tm_zone is dynamically allocated while loading the zone data. But
377 when another zone is loaded since the information in TP were
378 computed this would be a stale pointer.
379 The second problem is the POSIX test suite which assumes setting
380 the environment variable TZ to a new value before calling strftime()
381 will influence the result (the %Z format) even if the information in
382 TP is computed with a totally different time zone. --drepper@gnu */
383 zone = (const char *) tp->tm_zone;
386 /* POSIX.1 8.1.1 requires that whenever strftime() is called, the
387 time zone names contained in the external variable `tzname' shall
388 be set as if the tzset() function had been called. */
393 if (!(zone && *zone) && tp->tm_isdst >= 0)
394 zone = tzname[tp->tm_isdst];
397 zone = ""; /* POSIX.2 requires the empty string here. */
399 zonelen = strlen (zone);
404 if (hour12 == 0) hour12 = 12;
406 for (f = format; *f != '\0'; ++f)
408 int pad; /* Padding for number ('-', '_', or 0). */
409 int modifier; /* Field modifier ('E', 'O', or 0). */
410 int digits; /* Max digits for numeric format. */
411 int number_value; /* Numeric value to be printed. */
412 int negative_number; /* 1 if the number is negative. */
415 char buf[1 + (sizeof (int) < sizeof (time_t)
416 ? INT_STRLEN_BOUND (time_t)
417 : INT_STRLEN_BOUND (int))];
429 case '\a': case '\b': case '\t': case '\n':
430 case '\v': case '\f': case '\r':
431 case ' ': case '!': case '"': case '#': case '&': case'\'':
432 case '(': case ')': case '*': case '+': case ',': case '-':
433 case '.': case '/': case '0': case '1': case '2': case '3':
434 case '4': case '5': case '6': case '7': case '8': case '9':
435 case ':': case ';': case '<': case '=': case '>': case '?':
436 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
437 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
438 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
439 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
440 case 'Y': case 'Z': case '[': case'\\': case ']': case '^':
441 case '_': case 'a': case 'b': case 'c': case 'd': case 'e':
442 case 'f': case 'g': case 'h': case 'i': case 'j': case 'k':
443 case 'l': case 'm': case 'n': case 'o': case 'p': case 'q':
444 case 'r': case 's': case 't': case 'u': case 'v': case 'w':
445 case 'x': case 'y': case 'z': case '{': case '|': case '}':
447 /* The C Standard requires these 98 characters (plus '%') to
448 be in the basic execution character set. None of these
449 characters can start a multibyte sequence, so they need
450 not be analyzed further. */
455 /* Copy this multibyte sequence until we reach its end, find
456 an error, or come back to the initial shift state. */
458 mbstate_t mbstate = mbstate_zero;
463 size_t bytes = mbrlen (f + len, (size_t) -1, &mbstate);
468 if (bytes == (size_t) -2 || bytes == (size_t) -1)
476 while (! mbsinit (&mbstate));
483 #else /* ! DO_MULTIBYTE */
485 /* Either multibyte encodings are not supported, or they are
486 safe for formats, so any non-'%' byte can be copied through. */
493 #endif /* ! DO_MULTIBYTE */
495 /* Check for flags that can modify a format. */
500 /* This influences the number formats. */
507 /* This changes textual output. */
519 /* As a GNU extension we allow to specify the field width. */
529 while (ISDIGIT (*f));
532 /* Check for modifiers. */
545 /* Now do the specified format. */
548 #define DO_NUMBER(d, v) \
549 digits = d; number_value = v; goto do_number
550 #define DO_NUMBER_SPACEPAD(d, v) \
551 digits = d; number_value = v; goto do_number_spacepad
562 cpy (aw_len, a_wkday);
568 cpy (wkday_len, f_wkday);
572 case 'h': /* POSIX.2 extension. */
575 cpy (am_len, a_month);
581 cpy (month_len, f_month);
588 if (! (modifier == 'E'
589 && *(subfmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT)) != '\0'))
590 subfmt = _NL_CURRENT (LC_TIME, D_T_FMT);
592 subfmt = "%a %b %e %H:%M:%S %Y";
598 size_t len = strftime (NULL, maxsize - i, subfmt, tp);
599 if (len == 0 && *subfmt)
601 add (len, strftime (p, maxsize - i, subfmt, tp));
604 while (old_start < p)
606 *old_start = TOUPPER (*old_start);
612 case 'C': /* POSIX.2 extension. */
615 #if HAVE_STRUCT_ERA_ENTRY
618 struct era_entry *era = _nl_get_era_entry (tp);
621 size_t len = strlen (era->name_fmt);
622 cpy (len, era->name_fmt);
628 int year = tp->tm_year + TM_YEAR_BASE;
629 DO_NUMBER (1, year / 100 - (year % 100 < 0));
636 if (! (modifier == 'E'
637 && *(subfmt = _NL_CURRENT (LC_TIME, ERA_D_FMT)) != '\0'))
638 subfmt = _NL_CURRENT (LC_TIME, D_FMT);
642 case 'D': /* POSIX.2 extension. */
652 DO_NUMBER (2, tp->tm_mday);
654 case 'e': /* POSIX.2 extension. */
658 DO_NUMBER_SPACEPAD (2, tp->tm_mday);
660 /* All numeric formats set DIGITS and NUMBER_VALUE and then
661 jump to one of these two labels. */
664 /* Force `_' flag unless overwritten by `0' flag. */
669 /* Format the number according to the MODIFIER flag. */
672 if (modifier == 'O' && 0 <= number_value)
674 /* Get the locale specific alternate representation of
675 the number NUMBER_VALUE. If none exist NULL is returned. */
676 const char *cp = _nl_get_alt_digit (number_value);
680 size_t digitlen = strlen (cp);
690 unsigned int u = number_value;
692 bufp = buf + sizeof (buf);
693 negative_number = number_value < 0;
699 *--bufp = u % 10 + '0';
700 while ((u /= 10) != 0);
703 do_number_sign_and_padding:
709 int padding = digits - (buf + sizeof (buf) - bufp);
713 while (0 < padding--)
718 bufp += negative_number;
719 while (0 < padding--)
726 cpy (buf + sizeof (buf) - bufp, bufp);
734 DO_NUMBER (2, tp->tm_hour);
740 DO_NUMBER (2, hour12);
742 case 'k': /* GNU extension. */
746 DO_NUMBER_SPACEPAD (2, tp->tm_hour);
748 case 'l': /* GNU extension. */
752 DO_NUMBER_SPACEPAD (2, hour12);
758 DO_NUMBER (3, 1 + tp->tm_yday);
764 DO_NUMBER (2, tp->tm_min);
770 DO_NUMBER (2, tp->tm_mon + 1);
772 case 'n': /* POSIX.2 extension. */
784 case 'R': /* GNU extension. */
788 case 'r': /* POSIX.2 extension. */
790 if (*(subfmt = _NL_CURRENT (LC_TIME, T_FMT_AMPM)) == '\0')
792 subfmt = "%I:%M:%S %p";
799 DO_NUMBER (2, tp->tm_sec);
801 case 's': /* GNU extension. */
809 /* Generate string value for T using time_t arithmetic;
810 this works even if sizeof (long) < sizeof (time_t). */
812 bufp = buf + sizeof (buf);
813 negative_number = t < 0;
824 /* Adjust if division truncates to minus infinity. */
825 if (0 < -1 % 10 && d < 0)
837 goto do_number_sign_and_padding;
844 if (! (modifier == 'E'
845 && *(subfmt = _NL_CURRENT (LC_TIME, ERA_T_FMT)) != '\0'))
846 subfmt = _NL_CURRENT (LC_TIME, T_FMT);
850 case 'T': /* POSIX.2 extension. */
854 case 't': /* POSIX.2 extension. */
858 case 'u': /* POSIX.2 extension. */
859 DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1);
865 DO_NUMBER (2, (tp->tm_yday - tp->tm_wday + 7) / 7);
868 case 'g': /* GNU extension. */
869 case 'G': /* GNU extension. */
873 int year = tp->tm_year + TM_YEAR_BASE;
874 int days = iso_week_days (tp->tm_yday, tp->tm_wday);
878 /* This ISO week belongs to the previous year. */
880 days = iso_week_days (tp->tm_yday + (365 + __isleap (year)),
885 int d = iso_week_days (tp->tm_yday - (365 + __isleap (year)),
889 /* This ISO week belongs to the next year. */
898 DO_NUMBER (2, (year % 100 + 100) % 100);
904 DO_NUMBER (2, days / 7 + 1);
912 DO_NUMBER (2, (tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7);
918 DO_NUMBER (1, tp->tm_wday);
921 #if HAVE_STRUCT_ERA_ENTRY
924 struct era_entry *era = _nl_get_era_entry (tp);
927 subfmt = strchr (era->name_fmt, '\0') + 1;
935 DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE);
938 #if HAVE_STRUCT_ERA_ENTRY
941 struct era_entry *era = _nl_get_era_entry (tp);
944 int delta = tp->tm_year - era->start_date[0];
945 DO_NUMBER (1, (era->offset
946 + (era->direction == '-' ? -delta : delta)));
950 DO_NUMBER (2, (tp->tm_year % 100 + 100) % 100);
956 case 'z': /* GNU extension. */
957 if (tp->tm_isdst < 0)
963 diff = tp->tm_gmtoff;
972 if (lt == (time_t) -1)
974 /* mktime returns -1 for errors, but -1 is also a
975 valid time_t value. Check whether an error really
978 localtime_r (<, &tm);
980 if ((ltm.tm_sec ^ tm.tm_sec)
981 | (ltm.tm_min ^ tm.tm_min)
982 | (ltm.tm_hour ^ tm.tm_hour)
983 | (ltm.tm_mday ^ tm.tm_mday)
984 | (ltm.tm_mon ^ tm.tm_mon)
985 | (ltm.tm_year ^ tm.tm_year))
989 if (! gmtime_r (<, >m))
992 diff = tm_diff (<m, >m);
1004 DO_NUMBER (4, (diff / 60) * 100 + diff % 60);
1007 case '\0': /* GNU extension: % at end of format. */
1011 /* Unknown format; output the format, including the '%',
1012 since this is most likely the right thing to do if a
1013 multibyte string has been misparsed. */
1017 for (flen = 1; f[1 - flen] != '%'; flen++)
1019 cpy (flen, &f[1 - flen]);