35#if (defined (__sun__) || defined (__sun) || defined (sun)) && defined (__EDG__)
57# ifndef _RWSTD_NO_PURE_C_HEADERS
60# define LC_MESSAGES _RWSTD_LC_MESSAGES
64# ifndef _RWSTD_NO_NL_LANGINFO
68# if defined (_RWSTD_MSVC) && defined (_WIN64)
70# pragma warning (disable: 4244)
87#if defined (__EDG__) || !defined (_RWSTD_NO_PURE_C_HEADERS)
88# if defined (__linux__) || defined (__sun)
94extern long int timezone;
103#ifdef _RWSTD_NO_DAYLIGHT
109#if defined (_RWSTD_NO_WCSFTIME) && !defined (_RWSTD_NO_WCSFTIME_IN_LIBC)
110# if defined _RWSTD_WCSFTIME_ARG3_T
112# undef _RWSTD_NO_WCSFTIME
116size_t wcsftime (
wchar_t*,
size_t, _RWSTD_WCSFTIME_ARG3_T,
const struct tm*);
126typedef _STD::ctype_base::mask MaskT;
127extern const MaskT __rw_classic_tab [];
130 (_RW::__rw_classic_tab [(unsigned char)c] & _RW::__rw_alpha)
133 (_RW::__rw_classic_tab [(unsigned char)c] & _RW::__rw_digit)
137__rw_get_timepunct (
const _RW::__rw_facet*,
int,
138 const void*[],
const _RWSTD_SIZE_T []);
142__rw_put_time (
const __rw_facet*,
char*, _RWSTD_SIZE_T,
143 _STD::ios_base&,
char,
const tm*,
144 char,
char,
int,
int);
147#ifndef _RWSTD_NO_WCHAR_T
151__rw_put_time (
const __rw_facet*,
wchar_t*, _RWSTD_SIZE_T,
152 _STD::ios_base&,
wchar_t,
const tm*,
153 char,
char,
int,
int);
161#ifdef _RWSTD_NO_NL_LANGINFO
163typedef unsigned char UChar;
168__rw_get_date_fmat (
char *fmt)
172 memset (&
t, 0,
sizeof t);
176 t.tm_mday = 1;
t.tm_mon = 1;
t.tm_year = 33;
183 const char percent_x[] =
"%x";
184 strftime (
tmp,
sizeof tmp, percent_x, &
t);
193 _RWSTD_SIZE_T abday_len = 0;
194 _RWSTD_SIZE_T day_len;
195 _RWSTD_SIZE_T abmon_len;
196 _RWSTD_SIZE_T mon_len;
198 for (
char *ptmp =
tmp; *ptmp; ) {
201 for (; (isspace)(
UChar (*ptmp)); ++ptmp)
204 const char *begin = ptmp;
207 for (; *ptmp && !(isdigit)(
UChar (*ptmp)); ++ptmp) {
208 if ((ispunct)(
UChar (*ptmp)) || (isspace)(
UChar (*ptmp))) {
210 for ( ; (ispunct)(
UChar (*ptmp)) || (isspace)(
UChar (*ptmp)); ++ptmp)
218 const _RWSTD_SIZE_T
len = ptmp - begin;
227 abday_len = strftime (abday,
sizeof abday,
"%a", &
t);
228 day_len = strftime (day,
sizeof day,
"%A", &
t);
229 abmon_len = strftime (abmon,
sizeof abmon,
"%b", &
t);
230 mon_len = strftime (mon,
sizeof mon,
"%B", &
t);
234 _RWSTD_SIZE_T
start = 0;
236 if (day_len <=
len && !memcmp (day, begin, day_len)) {
240 else if (mon_len <=
len && !memcmp (mon, begin, mon_len)) {
244 else if (abday_len <=
len && !memcmp (abday, begin, abday_len)) {
248 else if (abmon_len <=
len && !memcmp (abmon, begin, abmon_len)) {
258 *pfmt++ = begin [
start];
262 if ((isdigit)(
UChar (*ptmp))) {
264 for (begin = ptmp; (isdigit)(
UChar (*ptmp)); ++ptmp);
267 if (ptmp - begin == 1) {
269 if (pfmt != fmt + 1 &&
' ' == pfmt [-2]) {
275 else if (
'2' == *begin) {
279 else if (ptmp - begin == 2) {
280 if (
'0' == begin [0] &&
'1' == begin [1])
282 else if (
'0' == begin [0] &&
'2' == begin [1])
284 else if (
'3' == begin [0] &&
'3' == begin [1])
289 else if (ptmp - begin == 4 && !memcmp (begin,
"1933", 4))
305__rw_get_time_fmat (
char *fmt)
309 memset (&
t, 0,
sizeof t);
311 t.tm_sec = 3;
t.tm_min = 4;
t.tm_hour = 21;
316 strftime (
tmp,
sizeof tmp,
"%X", &
t);
322 _RWSTD_SIZE_T pm_len = 0;
324 for (
char *ptmp =
tmp; *ptmp; ) {
326 for (; (isspace)(
UChar (*ptmp)); ++ptmp)
329 const char *begin = ptmp;
331 for (; *ptmp && !(isdigit)(
UChar (*ptmp)); ++ptmp) {
332 if ( (ispunct)(
UChar (*ptmp))
333 || (isspace)(
UChar (*ptmp))) {
334 for (; (ispunct)(
UChar (*ptmp))
335 || (isspace)(
UChar (*ptmp)); ++ptmp)
343 const _RWSTD_SIZE_T
len = ptmp - begin;
347 strftime (pm,
sizeof pm,
"%p", &
t);
348 pm_len = strlen (pm);
352 && !::memcmp (pm, begin, pm_len)) {
358 for (_RWSTD_SIZE_T
i = pm_len;
i !=
len; ++
i)
363 if ((isdigit)(
UChar (*ptmp))) {
365 for (begin = ptmp; (isdigit)(
UChar (*ptmp)); ++ptmp);
369 if (pfmt != fmt + 1 &&
' ' == pfmt [-2]) {
374 if (ptmp - begin == 1) {
377 case '3': *pfmt++ =
'S';
break;
378 case '4': *pfmt++ =
'M';
break;
379 case '9': *pfmt++ =
'I';
break;
380 default: *pfmt++ =
'\0';
383 else if (ptmp - begin == 2) {
385 if (
'0' == begin [0]) {
387 case '3': *pfmt++ =
'S';
break;
388 case '4': *pfmt++ =
'M';
break;
389 case '9': *pfmt++ =
'I';
break;
390 default: *pfmt++ =
'\0';
393 else if (
'2' == begin [0] &&
'1' == begin [1]) {
414__rw_get_timepunct (
const __rw_facet *pfacet,
int flags, _RWSTD_SIZE_T
inx)
416 const int member =
flags & ~__rw_wide;
417 const bool wide = !!(
flags & __rw_wide);
419 const void *pdata = pfacet->_C_data ();
423 const __rw_time_t*
const pun =
427 case __rw_abday:
return pun->abday (
inx, wide);
428 case __rw_day:
return pun->day (
inx, wide);
429 case __rw_abmon:
return pun->abmon (
inx, wide);
430 case __rw_month:
return pun->mon (
inx, wide);
431 case __rw_ampm:
return pun->am_pm (
inx, wide);
432 case __rw_d_t_fmt:
return pun->d_t_fmt (wide);
433 case __rw_d_fmt:
return pun->d_fmt (wide);
434 case __rw_t_fmt:
return pun->t_fmt (wide);
435 case __rw_t_fmt_ampm:
return pun->t_fmt_ampm (wide);
436 case __rw_era_d_t_fmt:
return pun->era_d_t_fmt (wide);
437 case __rw_era_d_fmt:
return pun->era_d_fmt (wide);
438 case __rw_era_t_fmt:
return pun->era_t_fmt (wide);
439 case __rw_era_names:
return pun->era_name (
inx, wide);
440 case __rw_era_fmts:
return pun->era_fmt (
inx, wide);
441 case __rw_alt_digits:
return pun->alt_digits (
inx, wide);
443 default:
return pdata;
447 const char*
const locname = pfacet->_C_get_name ();
450 const __rw_setlocale clocale (locname, _RWSTD_LC_ALL);
452 _RWSTD_SIZE_T bufsize = 2048;
454 const size_t newsize = bufsize +
sizeof (__rw_time_t);
463 memset (pun, 0,
sizeof *pun);
468#ifndef _RWSTD_NO_WCHAR_T
480 _RWSTD_SIZE_T
off =
sizeof (char);
484#ifndef _RWSTD_NO_NL_LANGINFO
486 static const struct {
488 _RWSTD_SIZE_T moff [2];
492#ifndef _RWSTD_NO_OFFSETOF
493# define OFF(T, m) offsetof (T, m)
495# define OFF(T, m) ((char*)&((T*)0)->m - (char*)0)
500#define ENTRY(item, mem1, mem2) { \
502 { OFF (__rw_time_t, __rw_time_t::mem1) / sizeof (_RWSTD_UINT32_T), \
503 OFF (__rw_time_t, __rw_time_t::mem2) / sizeof (_RWSTD_UINT32_T) } \
511 ENTRY (D_T_FMT, d_t_fmt_off [0], d_t_fmt_off [1]),
512 ENTRY (D_FMT, d_fmt_off [0], d_fmt_off [1]),
513 ENTRY (T_FMT, t_fmt_off [0], t_fmt_off [1]),
516 ENTRY (T_FMT_AMPM, t_fmt_ampm_off [0], t_fmt_ampm_off [1]),
518 ENTRY (D_T_FMT, t_fmt_ampm_off [0], t_fmt_ampm_off [1]),
521 ENTRY (AM_STR, am_pm_off [0][0], am_pm_off [1][0]),
522 ENTRY (PM_STR, am_pm_off [0][1], am_pm_off [1][1]),
524 ENTRY (ABDAY_1, abday_off [0][0], abday_off [1][0]),
525 ENTRY (ABDAY_2, abday_off [0][1], abday_off [1][1]),
526 ENTRY (ABDAY_3, abday_off [0][2], abday_off [1][2]),
527 ENTRY (ABDAY_4, abday_off [0][3], abday_off [1][3]),
528 ENTRY (ABDAY_5, abday_off [0][4], abday_off [1][4]),
529 ENTRY (ABDAY_6, abday_off [0][5], abday_off [1][5]),
530 ENTRY (ABDAY_7, abday_off [0][6], abday_off [1][6]),
532 ENTRY (DAY_1, day_off [0][0], day_off [1][0]),
533 ENTRY (DAY_2, day_off [0][1], day_off [1][1]),
534 ENTRY (DAY_3, day_off [0][2], day_off [1][2]),
535 ENTRY (DAY_4, day_off [0][3], day_off [1][3]),
536 ENTRY (DAY_5, day_off [0][4], day_off [1][4]),
537 ENTRY (DAY_6, day_off [0][5], day_off [1][5]),
538 ENTRY (DAY_7, day_off [0][6], day_off [1][6]),
540 ENTRY (ABMON_1, abmon_off [0][ 0], abmon_off [1][ 0]),
541 ENTRY (ABMON_2, abmon_off [0][ 1], abmon_off [1][ 1]),
542 ENTRY (ABMON_3, abmon_off [0][ 2], abmon_off [1][ 2]),
543 ENTRY (ABMON_4, abmon_off [0][ 3], abmon_off [1][ 3]),
544 ENTRY (ABMON_5, abmon_off [0][ 4], abmon_off [1][ 4]),
545 ENTRY (ABMON_6, abmon_off [0][ 5], abmon_off [1][ 5]),
546 ENTRY (ABMON_7, abmon_off [0][ 6], abmon_off [1][ 6]),
547 ENTRY (ABMON_8, abmon_off [0][ 7], abmon_off [1][ 7]),
548 ENTRY (ABMON_9, abmon_off [0][ 8], abmon_off [1][ 8]),
549 ENTRY (ABMON_10, abmon_off [0][ 9], abmon_off [1][ 9]),
550 ENTRY (ABMON_11, abmon_off [0][10], abmon_off [1][10]),
551 ENTRY (ABMON_12, abmon_off [0][11], abmon_off [1][11]),
553 ENTRY (MON_1, mon_off [0][ 0], mon_off [1][ 0]),
554 ENTRY (MON_2, mon_off [0][ 1], mon_off [1][ 1]),
555 ENTRY (MON_3, mon_off [0][ 2], mon_off [1][ 2]),
556 ENTRY (MON_4, mon_off [0][ 3], mon_off [1][ 3]),
557 ENTRY (MON_5, mon_off [0][ 4], mon_off [1][ 4]),
558 ENTRY (MON_6, mon_off [0][ 5], mon_off [1][ 5]),
559 ENTRY (MON_7, mon_off [0][ 6], mon_off [1][ 6]),
560 ENTRY (MON_8, mon_off [0][ 7], mon_off [1][ 7]),
561 ENTRY (MON_9, mon_off [0][ 8], mon_off [1][ 8]),
562 ENTRY (MON_10, mon_off [0][ 9], mon_off [1][ 9]),
563 ENTRY (MON_11, mon_off [0][10], mon_off [1][10]),
564 ENTRY (MON_12, mon_off [0][11], mon_off [1][11]),
567 ENTRY (ERA_D_T_FMT, era_d_t_fmt_off [0], era_d_t_fmt_off [1]),
569 ENTRY (D_T_FMT, era_d_t_fmt_off [0], era_d_t_fmt_off [1]),
573 ENTRY (ERA_D_FMT, era_d_fmt_off [0], era_d_fmt_off [1]),
575 ENTRY (D_T_FMT, era_d_fmt_off [0], era_d_fmt_off [1]),
579 ENTRY (ERA_T_FMT, era_t_fmt_off [0], era_t_fmt_off [1])
581 ENTRY (D_T_FMT, era_t_fmt_off [0], era_t_fmt_off [1])
589 const bool c_locale =
'C' == locname [0] &&
'\0' == locname [1];
591 for (_RWSTD_SIZE_T
i = 0;
i !=
sizeof nl_items /
sizeof *nl_items; ++
i) {
593 if (D_T_FMT == nl_items [
i].
nl_item &&
i)
597 const char*
const str =
i || !c_locale ?
598 nl_langinfo (nl_items [
i].
nl_item) :
"%a %b %e %H:%M:%S %Y";
602 _RWSTD_SIZE_T
size = 1 + strlen (
str);
606 const _RWSTD_SIZE_T estsize =
size * (1 +
sizeof (
wchar_t));
608 if (
off + estsize >= bufsize) {
610 const size_t tmpsize =
sizeof *pun + bufsize * 2 + estsize;
616 memcpy (
tmp, pun,
sizeof *pun +
off);
618 ::operator
delete (pun);
622 pbuf =
tmp +
sizeof *pun;
623 bufsize = bufsize * 2 + estsize;
628 pmem [nl_items [
i].moff [0]] =
632#ifndef _RWSTD_NO_WCHAR_T
635 const _RWSTD_SIZE_T align =
off %
sizeof (
wchar_t);
642 size = mbstowcs (pwbuf,
str, (bufsize -
off) /
sizeof (*pwbuf));
644 if (_RWSTD_SIZE_MAX ==
size) {
654 pmem [nl_items [
i].moff [1]] =
666 memset (&
t, 0,
sizeof t);
673 static const struct {
681 { &tm::tm_wday,
"%a", 0, 7, 1 },
682 { &tm::tm_wday,
"%A", 0, 7, 1 },
683 { &tm::tm_mon,
"%b", 0, 12, 1 },
684 { &tm::tm_mon,
"%B", 0, 12, 1 },
685 { &tm::tm_hour,
"%p", 1, 13, 12 }
688 for (_RWSTD_SIZE_T
i = 0;
i !=
sizeof fmats / sizef *fmats; ++
i) {
690 for (
int j = fmats [
i].begin;
j != fmats [
i].end;
j != fmats [
i].step) {
692 t.*fmats [
i].pmem =
j;
694 len = strftime (pbuf +
off, bufsize -
off, fmats [
i].fmt, &
t);
696 pun->abday_off [0][
t.tm_wday] =
off;
705 for (
t.tm_wday = 0;
t.tm_wday != 7; ++
t.tm_wday) {
707 len = strftime (pbuf +
off, bufsize -
off,
"%a", &
t);
709 pun->abday_off [0][
t.tm_wday] =
713 len = strftime (pbuf +
off, bufsize -
off,
"%A", &
t);
715 pun->day_off [0][
t.tm_wday] =
719# ifndef _RWSTD_NO_WCHAR_T
722 const _RWSTD_SIZE_T align =
off %
sizeof (
wchar_t);
726# ifndef _RWSTD_NO_WCSFTIME
729 len = wcsftime (pwbuf, (bufsize -
off) /
sizeof (*pwbuf),
L"%a", &
t);
731 pun->abday_off [1][
t.tm_wday] =
733 off += (
len + 1) *
sizeof (
wchar_t);
736 len = wcsftime (pwbuf, (bufsize -
off) /
sizeof (*pwbuf),
L"%A", &
t);
739 off += (
len + 1) *
sizeof (
wchar_t);
750 mbstowcs (pwbuf,
str, (bufsize -
off) /
sizeof (*pwbuf));
752 if (_RWSTD_SIZE_MAX ==
size) {
762 pun->abday_off [1][
t.tm_wday] =
off;
767 size = mbstowcs (pwbuf,
str, (bufsize -
off) /
sizeof (*pwbuf));
769 if (_RWSTD_SIZE_MAX ==
size) {
779 pun->day_off [1][
t.tm_wday] =
off;
788 for (
t.tm_mon = 0;
t.tm_mon != 12; ++
t.tm_mon) {
790 len = strftime (pbuf +
off, bufsize -
off,
"%b", &
t);
792 pun->abmon_off [0][
t.tm_mon] =
796 len = strftime (pbuf +
off, bufsize -
off,
"%B", &
t);
801# ifndef _RWSTD_NO_WCHAR_T
804 const _RWSTD_SIZE_T align =
off %
sizeof (
wchar_t);
808# ifndef _RWSTD_NO_WCSFTIME
811 len = wcsftime (pwbuf, (bufsize -
off) /
sizeof (*pwbuf),
L"%b", &
t);
813 pun->abmon_off [1][
t.tm_mon] =
815 off += (
len + 1) *
sizeof (
wchar_t);
818 len = wcsftime (pwbuf, (bufsize -
off) /
sizeof (*pwbuf),
L"%B", &
t);
821 off += (
len + 1) *
sizeof (
wchar_t);
831 mbstowcs (pwbuf,
str, (bufsize -
off) /
sizeof (*pwbuf));
833 if (_RWSTD_SIZE_MAX ==
size) {
843 pun->abmon_off [1][
t.tm_mon] =
off;
848 size = mbstowcs (pwbuf,
str, (bufsize -
off) /
sizeof (*pwbuf));
850 if (_RWSTD_SIZE_MAX ==
size) {
860 pun->mon_off [1][
t.tm_mon] =
off;
870 len = strftime (pbuf +
off, bufsize -
off,
"%p", &
t);
875 len = strftime (pbuf +
off, bufsize -
off,
"%p", &
t);
880 len = __rw_get_date_fmat (pbuf +
off);
885 len = __rw_get_time_fmat (pbuf +
off);
893 static const char t_fmt_ampm_fmat[] =
"%I:%M:%S %p";
895 len =
sizeof t_fmt_ampm_fmat;
896 memcpy (pbuf +
off, t_fmt_ampm_fmat,
len);
904 static const char d_t_fmat[] =
"%a %b %e %H:%M:%S %Y";
905 len =
sizeof d_t_fmat;
906 memcpy (pbuf +
off, d_t_fmat,
len);
917# ifndef _RWSTD_NO_WCHAR_T
919 const _RWSTD_SIZE_T align =
off %
sizeof (
wchar_t);
927# ifndef _RWSTD_NO_WCSFTIME
931 len = wcsftime (pwbuf, (bufsize -
off) /
sizeof (*pwbuf),
L"%p", &
t);
933 off += (
len + 1) *
sizeof (
wchar_t);
937 len = wcsftime (pwbuf, (bufsize -
off) /
sizeof (*pwbuf),
L"%p", &
t);
939 off += (
len + 1) *
sizeof (
wchar_t);
945 size = mbstowcs (pwbuf,
str, (bufsize -
off) /
sizeof (*pwbuf));
947 if (_RWSTD_SIZE_MAX ==
size) {
957 pun->am_pm_off [1][0] =
off;
962 size = mbstowcs (pwbuf,
str, (bufsize -
off) /
sizeof (*pwbuf));
964 if (_RWSTD_SIZE_MAX ==
size) {
974 pun->am_pm_off [1][1] =
off;
982 size = mbstowcs (pwbuf,
str, (bufsize -
off) /
sizeof (*pwbuf));
984 if (_RWSTD_SIZE_MAX ==
size) {
1000 size = mbstowcs (pwbuf,
str, (bufsize -
off) /
sizeof (*pwbuf));
1002 if (_RWSTD_SIZE_MAX ==
size) {
1018 size = mbstowcs (pwbuf,
str, (bufsize -
off) /
sizeof (*pwbuf));
1020 if (_RWSTD_SIZE_MAX ==
size) {
1036 size = mbstowcs (pwbuf,
str, (bufsize -
off) /
sizeof (*pwbuf));
1038 if (_RWSTD_SIZE_MAX ==
size) {
1062 return __rw_get_timepunct (pfacet,
flags,
inx);
1067__rw_get_timepunct (
const __rw_facet *pfacet,
int flags,
1068 const void *names[], _RWSTD_SIZE_T sizes[])
1070 const bool wide = !!(
flags & __rw_wide);
1072 const int member =
flags & ~__rw_wide;
1074 _RWSTD_SIZE_T
count = 0;
1096 case __rw_t_fmt_ampm:
1097 case __rw_era_d_t_fmt:
1098 case __rw_era_d_fmt:
1099 case __rw_era_t_fmt:
1104 case __rw_era_names: {
1106 const __rw_time_t*
const ptime =
1108 __rw_get_timepunct (pfacet, 0, 0));
1110 count = (_RWSTD_SIZE_T)ptime->era_count ();
1114 case __rw_abday | __rw_day:
1117 flags_2 = __rw_abday;
1120 case __rw_abmon | __rw_month:
1123 flags_2 = __rw_abmon;
1126 case __rw_alt_digits: {
1128 const __rw_time_t*
const ptime =
1130 __rw_get_timepunct (pfacet, 0, 0));
1132 count = (_RWSTD_SIZE_T)ptime->alt_digits_count ();
1141 typedef _STD::char_traits<char> CTraits;
1143#ifndef _RWSTD_NO_WCHAR_T
1145 typedef _STD::char_traits<wchar_t> WTraits;
1152 for (_RWSTD_SIZE_T
i = 0;
i !=
count; ++
i) {
1153 names [
i] = __rw_get_timepunct (pfacet,
flags,
i);
1155#ifndef _RWSTD_NO_WCHAR_T
1158 sizes [
i] = WTraits::length ((
const wchar_t*)names [
i]);
1163 sizes [
i] = CTraits::length ((
const char*)names [
i]);
1169 flags_2 |= __rw_wide;
1172 names [
j] = __rw_get_timepunct (pfacet, flags_2,
j -
count);
1174#ifndef _RWSTD_NO_WCHAR_T
1177 sizes [
j] = WTraits::length ((
const wchar_t*)names [
j]);
1182 sizes [
j] = CTraits::length ((
const char*)names [
j]);
1193__rw_get_timepunct (
const __rw_facet *pfacet,
1194 int data [4], tm *tmb,
int **pmem,
1195 const void *names[], _RWSTD_SIZE_T sizes[])
1200 _DateTime = __rw_d_t_fmt,
1201 _Days = __rw_day | __rw_abday,
1202 _Mons = __rw_month | __rw_abmon,
1204 _TimeAmPm = __rw_t_fmt_ampm,
1207 _AltDigits = __rw_alt_digits,
1208 _EraDate = __rw_era_d_fmt,
1209 _EraDateTime = __rw_era_d_t_fmt,
1210 _EraFmts = __rw_era_fmts,
1211 _EraTime = __rw_era_t_fmt,
1212 _EraNames = __rw_era_names
1215 const char fmt =
data [0];
1216 const char mod =
data [1];
1217 const bool wide = 0 !=
data [2];
1219 int &adj =
data [0];
1220 int &fac =
data [1];
1221 int &lob =
data [2];
1222 int &hib =
data [3];
1232 _RWSTD_SIZE_T
cnt = 0;
1242 *pmem = &tmb->tm_year;
1248 flags = _EraDateTime;
1272 else if (
'O' == mod) {
1280 *pmem = &tmb->tm_mday;
1287 *pmem = &tmb->tm_hour;
1293 *pmem = &tmb->tm_hour;
1299 *pmem = &tmb->tm_mon;
1306 *pmem = &tmb->tm_min;
1312 *pmem = &tmb->tm_sec;
1332 *pmem = &tmb->tm_wday;
1338 *pmem = &tmb->tm_year;
1351 *pmem = &tmb->tm_wday;
1356 case 'B':
case 'b':
case 'h':
1357 *pmem = &tmb->tm_mon;
1367 *pmem = &tmb->tm_year;
1375 static const void*
const pat[] = {
"%m/%d/%y",
L"%m/%d/%y" };
1376 names [0] = pat [wide];
1385 *pmem = &tmb->tm_mday;
1391 *pmem = &tmb->tm_hour;
1398 *pmem = &tmb->tm_hour;
1404 *pmem = &tmb->tm_yday;
1409 *pmem = &tmb->tm_min;
1415 *pmem = &tmb->tm_mon;
1419 *pmem = &tmb->tm_hour;
1424 static const void*
const pat[] = {
"%H:%M",
L"%H:%M" };
1425 names [0] = pat [wide];
1437 *pmem = &tmb->tm_sec;
1441 static const void*
const pat[] = {
"%H:%M:%S",
L"%H:%M:%S" };
1443 names [0] = pat [wide];
1461 *pmem = &tmb->tm_wday;
1473 *pmem = &tmb->tm_year;
1479 hib = _RWSTD_INT_MAX - 1900;
1480 *pmem = &tmb->tm_year;
1489 cnt = __rw_get_timepunct (pfacet,
flags | (wide ? __rw_wide : 0),
1497__rw_fmt_time (
const __rw_facet *pfacet,
char *
buf, _RWSTD_SIZE_T bufsize,
1498 _STD::ios_base &
flags,
char fill,
const tm *tmb,
1504 for (; *pat; ++pat) {
1506 if (
'%' == *pat && pat [1]) {
1533 else if (
'0' == *pat) {
1539 if (*pat >=
'0' && *pat <=
'9') {
1546 for (; *pat >=
'0' && *pat <=
'9'; ++pat) {
1548 width = width * 10 + *pat -
'0';
1555 if (*pat >=
'0' && *pat <=
'9') {
1564 for (; *pat >=
'0' && *pat <=
'9'; ++pat) {
1566 prec = prec * 10 + *pat -
'0';
1574 if (
'E' == fmtmod && *pat) {
1580 case 'c':
case 'C':
case 'x':
case 'X':
case 'y':
case 'Y':
1590 else if (
'O' == fmtmod) {
1596 case 'd':
case 'e':
case 'H':
case 'I':
case 'm':
case 'M':
1597 case 'S':
case 'u':
case 'U':
case 'V':
case 'w':
case 'W':
1613 if (
char (-1) != fmt) {
1615 tmb, fmt, fmtmod, width, prec);
1632#ifndef _RWSTD_NO_WCHAR_T
1635__rw_fmt_time (
const __rw_facet *pfacet,
wchar_t *wbuf, _RWSTD_SIZE_T bufsize,
1636 _STD::ios_base &
flags,
wchar_t fill,
const tm *tmb,
1637 const wchar_t *wpat)
1642 for (; *wpat; ++wpat) {
1644 if (
L'%' == *wpat && wpat [1]) {
1666 if (
L'-' == *wpat) {
1671 else if (
L'0' == *wpat) {
1677 if (*wpat >=
L'0' && *wpat <=
L'9') {
1684 for (; *wpat >=
L'0' && *wpat <=
L'9'; ++wpat) {
1686 width = width * 10U + *wpat -
L'0';
1690 if (
L'.' == *wpat) {
1693 if (*wpat >=
L'0' && *wpat <=
L'9') {
1702 for (; *wpat >=
L'0' && *wpat <=
L'9'; ++wpat) {
1704 prec = prec * 10 + *wpat -
L'0';
1709 char fmtmod = char (*wpat);
1712 if (
'E' == fmtmod && *wpat) {
1714 fmt = char (*++wpat);
1718 case 'c':
case 'C':
case 'x':
case 'X':
case 'y':
case 'Y':
1728 else if (
'O' == fmtmod) {
1730 fmt = char (*++wpat);
1734 case 'd':
case 'e':
case 'H':
case 'I':
case 'm':
case 'M':
1735 case 'S':
case 'u':
case 'U':
case 'V':
case 'w':
case 'W':
1751 if (
char (-1) != fmt) {
1752 wchar_t*
const end =
1753 __rw_put_time (pfacet, wbuf, bufsize,
flags,
fill,
1754 tmb, fmt, fmtmod, width, prec);
1777 return y % 4 == 0 && (
y % 100 != 0 ||
y % 400 == 0);
1784__rw_iso_week (
int& year,
int yday,
int wday)
1788 const int w = (wday + 7 - 1) % 7;
1791 const int y = 365 + __rw_isleap (year);
1794 const int fdoy = (yday + 7 -
w) % 7;
1800 isow = yday + (7 - fdoy);
1810 return __rw_iso_week (year, yday + 365 + __rw_isleap (year), wday);
1814 const int r =
y - yday;
1815 if (r <= 3 && 3 - r >=
w) {
1827static const __rw_time_t::era_t*
1828__rw_get_era (
const __rw_time_t *ptime,
const tm *tmb)
1832 const int year = 1900 + tmb->tm_year;
1835 const _RWSTD_SIZE_T neras = (_RWSTD_SIZE_T)ptime->era_count ();
1837 for (_RWSTD_SIZE_T
i = 0;
i != neras; ++
i) {
1838 const __rw_time_t::era_t*
const pera = ptime->era (
i);
1844 const int b = pera->offset < 0;
1848 if ( year > pera->year [
b] && year < pera->year [
e]
1849 || ( (year == pera->year [
b] || year == pera->year [
e])
1850 && ( tmb->tm_mon > pera->month [
b]
1851 && tmb->tm_mon < pera->month [
e]
1852 || ( ( tmb->tm_mon == pera->month [
b]
1853 || tmb->tm_mon == pera->month [
e])
1854 && tmb->tm_mday >= pera->day [
b]
1855 && tmb->tm_mday <= pera->day [
e])))) {
1865__rw_get_zone_off (
const char *
var,
const char **var_end)
1876 else if (
'+' == *
var) {
1892 if (offset < 2 || *var >=
'0' && *
var <=
'4') {
1916 if (
var [0] >=
'0' &&
var [0] <=
'5'
1946struct __rw_time_put_data
1958__rw_get_zone (__rw_time_put_data &tpd,
const char *
var,
int isdst)
1974 while (*
var &&
'>' != *
var++);
1977 const char*
const stdbeg =
var;
1993 std_off = __rw_get_zone_off (
var, &
var);
1995 if (*
var && _RWSTD_INT_MIN != std_off && isdst) {
1997 const char*
const dstbeg =
var;
2001 while (*
var &&
'>' != *
var++);
2011 tpd.val = __rw_get_zone_off (
var, &
var);
2013 if (_RWSTD_INT_MIN == tpd.val) {
2023 tpd.val = std_off + 100;
2046#ifndef _RWSTD_NO_TIMEZONE
2060 static const time_t tgm = 0;
2062 const tm*
const tmp = gmtime (&tgm);
2067 const time_t tlocal = mktime (&tmgm);
2069 if (time_t (-1) != tlocal) {
2071 const double diff = difftime (tlocal, tgm);
2073 tpd.val = int (diff / 60);
2088 tpd.val = 100 * (tpd.val / 60) + tpd.val % 60;
2090 if (daylight && isdst)
2091 tpd.val += (tpd.val < 0 ? -100 : 100) * isdst;
2098__rw_get_zone_name (__rw_time_put_data&,
const char*,
int)
2107__rw_get_time_put_data (__rw_time_put_data &tpd,
2108 const __rw_facet *facet,
2110 char fmt,
char mod,
bool wide)
2116 ||
'c' == fmt ||
'r' == fmt ||
'x' == fmt ||
'X' == fmt);
2118 static const union {
2119#ifndef _RWSTD_NO_WCHAR_T
2120 wchar_t wide_data [1];
2123 } null_fmt = { { 0 } };
2125 const __rw_time_t *ptime =
2130 __rw_get_timepunct (facet, 0, 0));
2135 tpd.fmt = tpd.str = 0;
2136 tpd.val = tpd.altval = _RWSTD_INT_MIN;
2137 tpd.width = tpd.prec = 1;
2143 tpd.str = ptime->abday (tmb->tm_wday % 7U, wide);
2148 tpd.str = ptime->day (tmb->tm_wday % 7U, wide);
2153 tpd.str = ptime->abmon (tmb->tm_mon % 12U, wide);
2158 tpd.str = ptime->mon (tmb->tm_mon % 12U, wide);
2166 tpd.fmt = ptime->era_d_t_fmt (wide);
2169#ifndef _RWSTD_NO_WCHAR_T
2173 tpd.fmt = ptime->d_t_fmt (wide);
2185 const __rw_time_t::era_t *pera = __rw_get_era (ptime, tmb);
2188 const _RWSTD_PTRDIFF_T
i = pera - ptime->era (0);
2189 tpd.str = ptime->era_name (
i, wide);
2195 tpd.val = ((1900 + tmb->tm_year) / 100) % 100;
2207 tpd.altval = tmb->tm_mday;
2209 tpd.val = tmb->tm_mday;
2217 static const void*
const fmats[] = {
"%m/%d/%y",
L"%m/%d/%y" };
2219 tpd.fmt = fmats [wide];
2231 tpd.altval = tmb->tm_mday;
2233 tpd.val = tmb->tm_mday;
2242 static const void*
const fmats[] = {
"%Y-%m-%d",
L"%Y-%m-%d" };
2244 tpd.fmt = fmats [wide];
2253 tpd.val = tmb->tm_year + 1900;
2254 __rw_iso_week (tpd.val, tmb->tm_yday, tmb->tm_wday);
2265 tpd.val = tmb->tm_year + 1900;
2266 __rw_iso_week (tpd.val, tmb->tm_yday, tmb->tm_wday);
2272 tpd.fmt = ptime->abmon (tmb->tm_mon % 12U, wide);
2289 tpd.altval = tmb->tm_hour;
2291 tpd.val = tmb->tm_hour;
2312 unsigned hour = tmb->tm_hour % 12;
2332 tpd.val = tmb->tm_yday + 1;
2341 tpd.altval = tmb->tm_mon + 1;
2343 tpd.val = tmb->tm_mon + 1;
2353 tpd.altval = tmb->tm_min;
2355 tpd.val = tmb->tm_min;
2362 static const void*
const fmats [] = {
"\n",
L"\n" };
2363 tpd.str = fmats [wide];
2370 tpd.fmt = ptime->am_pm ((tmb->tm_hour / 12) % 2U, wide);
2375 tpd.fmt = ptime->t_fmt_ampm (wide);
2380 static const void*
const fmats[] = {
"%H:%M",
L"%H:%M" };
2382 tpd.fmt = fmats [wide];
2391 tpd.altval = tmb->tm_sec;
2393 tpd.val = tmb->tm_sec;
2400 static const void*
const fmats[] = {
"\t",
L"\t" };
2402 tpd.str = fmats [wide];
2409 static const void*
const fmats[] = {
"%H:%M:%S",
L"%H:%M:%S" };
2411 tpd.fmt = fmats [wide];
2422 tpd.altval = 1 + (tmb->tm_wday ? tmb->tm_wday - 1 : 6);
2424 tpd.val = 1 + (tmb->tm_wday ? tmb->tm_wday - 1 : 6);
2435 const int week = (tmb->tm_yday - tmb->tm_wday + 7) / 7;
2452 int year = tmb->tm_year + 1900;
2454 __rw_iso_week (year, tmb->tm_yday, tmb->tm_wday) / 7 + 1;
2472 tpd.altval = tmb->tm_wday;
2474 tpd.val = tmb->tm_wday;
2485 const int week = (tmb->tm_yday - (tmb->tm_wday - 1 + 7) % 7 + 7) / 7;
2501 tpd.fmt = ptime->era_d_fmt (wide);
2504#ifndef _RWSTD_NO_WCHAR_T
2508 tpd.fmt = ptime->d_fmt (wide);
2517 tpd.fmt = ptime->era_t_fmt (wide);
2520#ifndef _RWSTD_NO_WCHAR_T
2524 tpd.fmt = ptime->t_fmt (wide);
2538 const __rw_time_t::era_t*
const pera = __rw_get_era (ptime, tmb);
2541 tpd.altval = pera->offset < 0
2542 ? pera->year [0] - 1900 - tmb->tm_year - pera->offset
2543 : 1900 + tmb->tm_year - pera->year [0] + pera->offset;
2550 tpd.altval = (1900 + tmb->tm_year) % 100;
2552 tpd.val = (1900 + tmb->tm_year) % 100;
2562 const __rw_time_t::era_t*
const pera = __rw_get_era (ptime, tmb);
2565 && !!(tpd.fmt = ptime->era_fmt (pera - ptime->era (0), wide)))
2569 tpd.val = 1900 + tmb->tm_year;
2584 if (tmb->tm_isdst < 0) {
2586 tpd.val = _RWSTD_INT_MIN;
2587 tpd.fmt = null_fmt.data;
2601#if defined (__GLIBC__) && defined (_RWSTD_NO_PURE_C_HEADERS)
2606# if defined (__STRICT_ANSI__) && !defined (__USE_BSD)
2608 tpd.val = tmb->__tm_gmtoff;
2612 tpd.val = tmb->tm_gmtoff;
2621 tpd.val = 100 * (tpd.val / 60) + tpd.val % 60;
2632 const char*
const var = getenv (
"TZ");
2634 if (!
var || !*
var || __rw_get_zone (tpd,
var, tmb->tm_isdst)) {
2636 tpd.val = _RWSTD_INT_MIN;
2637 tpd.fmt = null_fmt.data;
2642 const char*
const var = getenv (
"TZ");
2646 tpd.val = _RWSTD_INT_MIN;
2647 tpd.fmt = null_fmt.data;
2651 __rw_get_zone_name (tpd,
var, tmb->tm_isdst);
2658 static const void*
const fmats[] = {
"%",
L"%" };
2660 tpd.str = fmats [wide];
2670__rw_put_time (
const __rw_facet *facet,
char *
buf, _RWSTD_SIZE_T bufsize,
2671 _STD::ios_base &
flags,
char fill,
const tm *tmb,
2672 char fmt,
char mod,
int width,
int prec)
2676 _RWSTD_SIZE_T
res = 0;
2679 __rw_time_put_data tpd;
2680 __rw_get_time_put_data (tpd, facet, tmb, fmt, mod,
false );
2682 if (_RWSTD_INT_MIN != tpd.altval) {
2686 const __rw_time_t *ptime =
2691 const _RWSTD_UINT32_T ndigits = ptime->alt_digits_count ();
2693 const _RWSTD_UINT32_T altval =
2696 if (altval < ndigits) {
2714 tpd.val = tpd.altval;
2717 if (_RWSTD_INT_MIN != tpd.val) {
2719 const char*
const fmtstr =
'z' == fmt ?
"%+*.*d" :
"%*.*d";
2721 res = (_RWSTD_SIZE_T)sprintf (
buf, fmtstr,
2722 width < 0 ? tpd.width : width,
2723 prec < 0 ? tpd.prec : prec, tpd.val);
2726 if (!tmb && tpd.fmt) {
2733 const char*
const fmtstr =
2736 return __rw_fmt_time (facet,
buf, bufsize,
flags,
2745 for (
char *dst =
buf; *src &&
res < bufsize; ++src, ++dst, ++
res)
2751 char fmtstr [4] = {
'%', fmt,
'\0',
'\0' };
2759 res = strftime (
buf, bufsize, fmtstr, tmb);
2769#ifndef _RWSTD_NO_WCHAR_T
2772__rw_put_time (
const __rw_facet *facet,
wchar_t *wbuf, _RWSTD_SIZE_T bufsize,
2773 _STD::ios_base &
flags,
wchar_t fill,
const tm *tmb,
2774 char fmt,
char mod,
int width,
int prec)
2778 _RWSTD_SIZE_T
res = 0;
2780 __rw_time_put_data tpd;
2782 __rw_get_time_put_data (tpd, facet, tmb, fmt, mod,
true );
2784 if (_RWSTD_INT_MIN != tpd.altval) {
2786 const __rw_time_t *ptime =
2791 const _RWSTD_UINT32_T
n = ptime->alt_digits_count ();
2793 if (tpd.altval >= 0 && tpd.altval < int (
n)) {
2795 const _RWSTD_SIZE_T altval =
2799 const wchar_t* digit =
2804 wchar_t *pbuf = wbuf;
2813 tpd.val = tpd.altval;
2816 if (_RWSTD_INT_MIN != tpd.val) {
2818#ifndef _RWSTD_NO_SWPRINTF
2820 const wchar_t *fmtstr =
'z' == fmt ?
L"%+*.*d" :
L"%*.*d";
2822 res = swprintf (wbuf,
2823#
if !defined (__MINGW32__) && (!defined (_MSC_VER) || 1400 <= _MSC_VER)
2829 width < 0 ? tpd.width : width,
2830 prec < 0 ? tpd.prec : prec, tpd.val);
2834 const char *fmtstr =
'z' == fmt ?
"%+*.*d" :
"%*.*d";
2838 res = (_RWSTD_SIZE_T)::sprintf (
buf, fmtstr,
2839 width < 0 ? tpd.width : width,
2840 prec < 0 ? tpd.prec : prec, tpd.val);
2844 wchar_t *dst = wbuf;
2846 for (
const char *
s =
buf; *
s; ++
s, ++dst)
2855 if (!tmb && tpd.fmt) {
2862 const wchar_t*
const wfmt =
2865 return __rw_fmt_time (facet, wbuf, bufsize,
flags,
fill, tmb, wfmt);
2873 for (
wchar_t *dst = wbuf; *src &&
res < bufsize; ++src, ++dst, ++
res)
2880#if !defined (_RWSTD_NO_WCSFTIME_WCHAR_T_FMAT) && !defined (_RWSTD_NO_WCSFTIME)
2882 wchar_t fmtstr [4] = {
L'%', fmt,
L'\0',
L'\0' };
2888 char fmtstr [4] = {
'%', fmt,
'\0',
'\0' };
2897#ifndef _RWSTD_NO_WCSFTIME
2900 res = wcsftime (wbuf, bufsize, fmtstr, tmb);
2909 res = strftime (
buf,
sizeof buf, fmtstr, tmb);
2913 for (_RWSTD_SIZE_T
i = 0;
i !=
res; ++
i)
void count(T, T, const U &,...)
#define _RWSTD_REINTERPRET_CAST(T, x)
#define _RWSTD_STATIC_CAST(T, x)
#define _RWSTD_NAMESPACE(name)
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_CONST_CAST(T, x)
#define _RWSTD_MT_STATIC_GUARD(name)
#define ENTRY(item, mem1, mem2)