aboutsummaryrefslogtreecommitdiff
path: root/src/time_facets.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/time_facets.cpp')
-rw-r--r--src/time_facets.cpp565
1 files changed, 0 insertions, 565 deletions
diff --git a/src/time_facets.cpp b/src/time_facets.cpp
deleted file mode 100644
index 3e98c70..0000000
--- a/src/time_facets.cpp
+++ /dev/null
@@ -1,565 +0,0 @@
-/*
- * Copyright (c) 1999
- * Silicon Graphics Computer Systems, Inc.
- *
- * Copyright (c) 1999
- * Boris Fomitchev
- *
- * This material is provided "as is", with absolutely no warranty expressed
- * or implied. Any use is at your own risk.
- *
- * Permission to use or copy this software for any purpose is hereby granted
- * without fee, provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
- */
-
-#include "stlport_prefix.h"
-
-#include <cstdio>
-#include <locale>
-#include <istream>
-
-#include "c_locale.h"
-#include "acquire_release.h"
-
-_STLP_BEGIN_NAMESPACE
-
-_STLP_MOVE_TO_PRIV_NAMESPACE
-
-// default "C" values for month and day names
-
-const char default_dayname[][14] = {
- "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
- "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
- "Friday", "Saturday"};
-
-const char default_monthname[][24] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
- "January", "February", "March", "April", "May", "June",
- "July", "August", "September", "October", "November", "December"};
-
-#ifndef _STLP_NO_WCHAR_T
-const wchar_t default_wdayname[][14] = {
- L"Sun", L"Mon", L"Tue", L"Wed", L"Thu", L"Fri", L"Sat",
- L"Sunday", L"Monday", L"Tuesday", L"Wednesday", L"Thursday",
- L"Friday", L"Saturday"};
-
-const wchar_t default_wmonthname[][24] = {
- L"Jan", L"Feb", L"Mar", L"Apr", L"May", L"Jun",
- L"Jul", L"Aug", L"Sep", L"Oct", L"Nov", L"Dec",
- L"January", L"February", L"March", L"April", L"May", L"June",
- L"July", L"August", L"September", L"October", L"November", L"December"};
-#endif
-
-#if defined (__BORLANDC__)
-_Time_Info time_init<char>::_M_timeinfo;
-# ifndef _STLP_NO_WCHAR_T
-_WTime_Info time_init<wchar_t>::_M_timeinfo;
-# endif
-#endif
-
-// _Init_time_info: initialize table with
-// "C" values (note these are not defined in the C standard, so this
-// is somewhat arbitrary).
-
-static void _Init_timeinfo_base(_Time_Info_Base& table) {
- table._M_time_format = "%H:%M:%S";
- table._M_date_format = "%m/%d/%y";
- table._M_date_time_format = "%m/%d/%y";
-}
-
-static void _Init_timeinfo(_Time_Info& table) {
- int i;
- for (i = 0; i < 14; ++i)
- table._M_dayname[i] = default_dayname[i];
- for (i = 0; i < 24; ++i)
- table._M_monthname[i] = default_monthname[i];
- table._M_am_pm[0] = "AM";
- table._M_am_pm[1] = "PM";
- _Init_timeinfo_base(table);
-}
-
-#ifndef _STLP_NO_WCHAR_T
-static void _Init_timeinfo(_WTime_Info& table) {
- int i;
- for (i = 0; i < 14; ++i)
- table._M_dayname[i] = default_wdayname[i];
- for (i = 0; i < 24; ++i)
- table._M_monthname[i] = default_wmonthname[i];
- table._M_am_pm[0] = L"AM";
- table._M_am_pm[1] = L"PM";
- _Init_timeinfo_base(table);
-}
-#endif
-
-static void _Init_timeinfo_base(_Time_Info_Base& table, _Locale_time * time) {
- table._M_time_format = _Locale_t_fmt(time);
- if ( table._M_time_format == "%T" ) {
- table._M_time_format = "%H:%M:%S";
- } else if ( table._M_time_format == "%r" ) {
- table._M_time_format = "%I:%M:%S %p";
- } else if ( table._M_time_format == "%R" ) {
- table._M_time_format = "%H:%M";
- }
- table._M_date_format = _Locale_d_fmt(time);
- table._M_date_time_format = _Locale_d_t_fmt(time);
- table._M_long_date_format = _Locale_long_d_fmt(time);
- table._M_long_date_time_format = _Locale_long_d_t_fmt(time);
-}
-
-static void _Init_timeinfo(_Time_Info& table, _Locale_time * time) {
- int i;
- for (i = 0; i < 7; ++i)
- table._M_dayname[i] = _Locale_abbrev_dayofweek(time, i);
- for (i = 0; i < 7; ++i)
- table._M_dayname[i+7] = _Locale_full_dayofweek(time, i);
- for (i = 0; i < 12; ++i)
- table._M_monthname[i] = _Locale_abbrev_monthname(time, i);
- for (i = 0; i < 12; ++i)
- table._M_monthname[i+12] = _Locale_full_monthname(time, i);
- table._M_am_pm[0] = _Locale_am_str(time);
- table._M_am_pm[1] = _Locale_pm_str(time);
- _Init_timeinfo_base(table, time);
-}
-
-#ifndef _STLP_NO_WCHAR_T
-static void _Init_timeinfo(_WTime_Info& table, _Locale_time * time) {
- wchar_t buf[128];
- int i;
- for (i = 0; i < 7; ++i)
- table._M_dayname[i] = _WLocale_abbrev_dayofweek(time, i, _STLP_ARRAY_AND_SIZE(buf));
- for (i = 0; i < 7; ++i)
- table._M_dayname[i+7] = _WLocale_full_dayofweek(time, i, _STLP_ARRAY_AND_SIZE(buf));
- for (i = 0; i < 12; ++i)
- table._M_monthname[i] = _WLocale_abbrev_monthname(time, i, _STLP_ARRAY_AND_SIZE(buf));
- for (i = 0; i < 12; ++i)
- table._M_monthname[i+12] = _WLocale_full_monthname(time, i, _STLP_ARRAY_AND_SIZE(buf));
- table._M_am_pm[0] = _WLocale_am_str(time, _STLP_ARRAY_AND_SIZE(buf));
- table._M_am_pm[1] = _WLocale_pm_str(time, _STLP_ARRAY_AND_SIZE(buf));
- _Init_timeinfo_base(table, time);
-}
-#endif
-
-template <class _Ch, class _TimeInfo>
-void __subformat(_STLP_BASIC_IOSTRING(_Ch) &buf, const ctype<_Ch>& ct,
- const string& format, const _TimeInfo& table, const tm* t) {
- const char * cp = format.data();
- const char * cp_end = cp + format.size();
- while (cp != cp_end) {
- if (*cp == '%') {
- char mod = 0;
- ++cp;
- if (*cp == '#') {
- mod = *cp; ++cp;
- }
- __write_formatted_timeT(buf, ct, *cp++, mod, table, t);
- } else
- buf.append(1, *cp++);
- }
-}
-
-static void __append(__iostring &buf, const string& name)
-{ buf.append(name.data(), name.data() + name.size()); }
-
-static void __append(__iowstring &buf, const wstring& name)
-{ buf.append(name.data(), name.data() + name.size()); }
-
-static void __append(__iostring &buf, char *first, char *last, const ctype<char>& /* ct */)
-{ buf.append(first, last); }
-
-static void __append(__iowstring &buf, char *first, char *last, const ctype<wchar_t>& ct) {
- wchar_t _wbuf[64];
- ct.widen(first, last, _wbuf);
- buf.append(_wbuf, _wbuf + (last - first));
-}
-
-#if defined (__GNUC__)
-/* The number of days from the first day of the first ISO week of this
- year to the year day YDAY with week day WDAY. ISO weeks start on
- Monday; the first ISO week has the year's first Thursday. YDAY may
- be as small as YDAY_MINIMUM. */
-# define __ISO_WEEK_START_WDAY 1 /* Monday */
-# define __ISO_WEEK1_WDAY 4 /* Thursday */
-# define __YDAY_MINIMUM (-366)
-# define __TM_YEAR_BASE 1900
-static int
-__iso_week_days(int yday, int wday) {
- /* Add enough to the first operand of % to make it nonnegative. */
- int big_enough_multiple_of_7 = (-__YDAY_MINIMUM / 7 + 2) * 7;
- return (yday
- - (yday - wday + __ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7
- + __ISO_WEEK1_WDAY - __ISO_WEEK_START_WDAY);
-}
-
-# define __is_leap(year)\
- ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
-
-#endif
-
-#define __hour12(hour) \
- (((hour) % 12 == 0) ? (12) : (hour) % 12)
-
-#if !defined (_STLP_USE_SAFE_STRING_FUNCTIONS)
-# define _STLP_SPRINTF sprintf
-#else
-# define _STLP_SPRINTF sprintf_s
-#endif
-
-template <class _Ch, class _TimeInfo>
-void _STLP_CALL __write_formatted_timeT(_STLP_BASIC_IOSTRING(_Ch) &buf,
- const ctype<_Ch>& ct,
- char format, char modifier,
- const _TimeInfo& table, const tm* t) {
- char _buf[64];
- char *_bend;
-
- switch (format) {
- case 'a':
- __append(buf, table._M_dayname[t->tm_wday]);
- break;
-
- case 'A':
- __append(buf, table._M_dayname[t->tm_wday + 7]);
- break;
-
- case 'b':
- __append(buf, table._M_monthname[t->tm_mon]);
- break;
-
- case 'B':
- __append(buf, table._M_monthname[t->tm_mon + 12]);
- break;
-
- case 'c':
- __subformat(buf, ct, (modifier != '#') ? table._M_date_time_format
- : table._M_long_date_time_format, table, t);
- break;
-
- case 'd':
- _STLP_SPRINTF(_buf, (modifier != '#') ? "%.2ld" : "%ld", (long)t->tm_mday);
- __append(buf, _buf, ((long)t->tm_mday < 10L && modifier == '#') ? _buf + 1 : _buf + 2, ct);
- break;
-
- case 'e':
- _STLP_SPRINTF(_buf, "%2ld", (long)t->tm_mday);
- __append(buf, _buf, _buf + 2, ct);
- break;
-
- case 'H':
- _STLP_SPRINTF(_buf, (modifier != '#') ? "%.2ld" : "%ld", (long)t->tm_hour);
- __append(buf, _buf, ((long)t->tm_hour < 10L && modifier == '#') ? _buf + 1 : _buf + 2, ct);
- break;
-
- case 'I':
- _STLP_SPRINTF(_buf, (modifier != '#') ? "%.2ld" : "%ld", (long)__hour12(t->tm_hour));
- __append(buf, _buf, ((long)__hour12(t->tm_hour) < 10L && modifier == '#') ? _buf + 1 : _buf + 2, ct);
- break;
-
- case 'j':
- _bend = __write_integer(_buf, 0, (long)((long)t->tm_yday + 1));
- __append(buf, _buf, _bend, ct);
- break;
-
- case 'm':
- _STLP_SPRINTF(_buf, (modifier != '#') ? "%.2ld" : "%ld", (long)t->tm_mon + 1);
- __append(buf, _buf, ((long)(t->tm_mon + 1) < 10L && modifier == '#') ? _buf + 1 : _buf + 2, ct);
- break;
-
- case 'M':
- _STLP_SPRINTF(_buf, (modifier != '#') ? "%.2ld" : "%ld", (long)t->tm_min);
- __append(buf, _buf, ((long)t->tm_min < 10L && modifier == '#') ? _buf + 1 : _buf + 2, ct);
- break;
-
- case 'p':
- __append(buf, table._M_am_pm[t->tm_hour / 12]);
- break;
-
- case 'S': // pad with zeros
- _STLP_SPRINTF(_buf, (modifier != '#') ? "%.2ld" : "%ld", (long)t->tm_sec);
- __append(buf, _buf, ((long)t->tm_sec < 10L && modifier == '#') ? _buf + 1 : _buf + 2, ct);
- break;
-
- case 'U':
- _bend = __write_integer(_buf, 0, long((t->tm_yday - t->tm_wday + 7) / 7));
- __append(buf, _buf, _bend, ct);
- break;
-
- case 'w':
- _bend = __write_integer(_buf, 0, (long)t->tm_wday);
- __append(buf, _buf, _bend, ct);
- break;
-
- case 'W':
- _bend = __write_integer(_buf, 0,
- (long)(t->tm_wday == 0 ? (t->tm_yday + 1) / 7 :
- (t->tm_yday + 8 - t->tm_wday) / 7));
- __append(buf, _buf, _bend, ct);
- break;
-
- case'x':
- __subformat(buf, ct, (modifier != '#') ? table._M_date_format
- : table._M_long_date_format, table, t);
- break;
-
- case 'X':
- __subformat(buf, ct, table._M_time_format, table, t);
- break;
-
- case 'y':
- _bend = __write_integer(_buf, 0, (long)((long)(t->tm_year + 1900) % 100));
- __append(buf, _buf, _bend, ct);
- break;
-
- case 'Y':
- _bend = __write_integer(_buf, 0, (long)((long)t->tm_year + 1900));
- __append(buf, _buf, _bend, ct);
- break;
-
- case '%':
- buf.append(1, ct.widen('%'));
- break;
-
-#if defined (__GNUC__)
- // fbp : at least on SUN
-# if defined (_STLP_UNIX) && !defined (__linux__)
-# define __USE_BSD 1
-# endif
-
- /*********************************************
- * JGS, handle various extensions *
- *********************************************/
-
- case 'h': /* POSIX.2 extension */
- // same as 'b', abbrev month name
- __append(buf, table._M_monthname[t->tm_mon]);
- break;
- case 'C': /* POSIX.2 extension */
- // same as 'd', the day
- _STLP_SPRINTF(_buf, "%2ld", (long)t->tm_mday);
- __append(buf, _buf, _buf + 2, ct);
- break;
-
- case 'D': /* POSIX.2 extension */
- // same as 'x'
- __subformat(buf, ct, table._M_date_format, table, t);
- break;
-
- case 'k': /* GNU extension */
- _STLP_SPRINTF(_buf, "%2ld", (long)t->tm_hour);
- __append(buf, _buf, _buf + 2, ct);
- break;
-
- case 'l': /* GNU extension */
- _STLP_SPRINTF(_buf, "%2ld", (long)t->tm_hour % 12);
- __append(buf, _buf, _buf + 2, ct);
- break;
-
- case 'n': /* POSIX.2 extension */
- buf.append(1, ct.widen('\n'));
- break;
-
- case 'R': /* GNU extension */
- __subformat(buf, ct, "%H:%M", table, t);
- break;
-
- case 'r': /* POSIX.2 extension */
- __subformat(buf, ct, "%I:%M:%S %p", table, t);
- break;
-
- case 'T': /* POSIX.2 extension. */
- __subformat(buf, ct, "%H:%M:%S", table, t);
- break;
-
- case 't': /* POSIX.2 extension. */
- buf.append(1, ct.widen('\t'));
-
- case 'u': /* POSIX.2 extension. */
- _bend = __write_integer(_buf, 0, long((t->tm_wday - 1 + 7)) % 7 + 1);
- __append(buf, _buf, _bend, ct);
- break;
-
- case 's': {
- time_t __t = mktime(__CONST_CAST(tm*, t));
- _bend = __write_integer(_buf, 0, (long)__t );
- __append(buf, _buf, _bend, ct);
- break;
- }
- case 'g': /* GNU extension */
- case 'G': {
- int year = t->tm_year + __TM_YEAR_BASE;
- int days = __iso_week_days (t->tm_yday, t->tm_wday);
- if (days < 0) {
- /* This ISO week belongs to the previous year. */
- year--;
- days = __iso_week_days (t->tm_yday + (365 + __is_leap (year)), t->tm_wday);
- }
- else {
- int d = __iso_week_days (t->tm_yday - (365 + __is_leap (year)), t->tm_wday);
- if (0 <= d) {
- /* This ISO week belongs to the next year. */
- ++year;
- days = d;
- }
- }
- long val;
- switch (format) {
- case 'g':
- val = (long)(year % 100 + 100) % 100;
- break;
- case 'G':
- val = (long)year;
- break;
- default:
- val = (long)days / 7 + 1;
- break;
- }
- _bend = __write_integer(_buf, 0, val);
- __append(buf, _buf, _bend, ct);
- break;
- }
-
-# if defined (_STLP_USE_GLIBC)
- case 'z': /* GNU extension. */
- if (t->tm_isdst < 0)
- break;
- {
- int diff;
-# if defined (__USE_BSD) || defined (__BEOS__)
- diff = t->tm_gmtoff;
-# else
- diff = t->__tm_gmtoff;
-# endif
- if (diff < 0) {
- buf.append(1, ct.widen('-'));
- diff = -diff;
- } else
- buf.append(1, ct.widen('+'));
- diff /= 60;
- _STLP_SPRINTF(_buf, "%.4d", (diff / 60) * 100 + diff % 60);
- __append(buf, _buf, _buf + 4, ct);
- break;
- }
-# endif /* __GLIBC__ */
-#endif /* __GNUC__ */
-
- default:
- break;
- }
-}
-
-void _STLP_CALL __write_formatted_time(__iostring &buf, const ctype<char>& ct,
- char format, char modifier,
- const _Time_Info& table, const tm* t)
-{ __write_formatted_timeT(buf, ct, format, modifier, table, t); }
-
-void _STLP_CALL __write_formatted_time(__iowstring &buf, const ctype<wchar_t>& ct,
- char format, char modifier,
- const _WTime_Info& table, const tm* t)
-{ __write_formatted_timeT(buf, ct, format, modifier, table, t); }
-
-static time_base::dateorder __get_date_order(_Locale_time* time) {
- const char * fmt = _Locale_d_fmt(time);
- char first, second, third;
-
- while (*fmt != 0 && *fmt != '%') ++fmt;
- if (*fmt == 0)
- return time_base::no_order;
- first = *++fmt;
- while (*fmt != 0 && *fmt != '%') ++fmt;
- if (*fmt == 0)
- return time_base::no_order;
- second = *++fmt;
- while (*fmt != 0 && *fmt != '%') ++fmt;
- if (*fmt == 0)
- return time_base::no_order;
- third = *++fmt;
-
- switch (first) {
- case 'd':
- return (second == 'm' && third == 'y') ? time_base::dmy
- : time_base::no_order;
- case 'm':
- return (second == 'd' && third == 'y') ? time_base::mdy
- : time_base::no_order;
- case 'y':
- switch (second) {
- case 'd':
- return third == 'm' ? time_base::ydm : time_base::no_order;
- case 'm':
- return third == 'd' ? time_base::ymd : time_base::no_order;
- default:
- return time_base::no_order;
- }
- default:
- return time_base::no_order;
- }
-}
-
-time_init<char>::time_init()
- : _M_dateorder(time_base::no_order)
-{ _Init_timeinfo(_M_timeinfo); }
-
-time_init<char>::time_init(const char* __name) {
- if (!__name)
- locale::_M_throw_on_null_name();
-
- int __err_code;
- char buf[_Locale_MAX_SIMPLE_NAME];
- _Locale_time *__time = __acquire_time(__name, buf, 0, &__err_code);
- if (!__time)
- locale::_M_throw_on_creation_failure(__err_code, __name, "time");
-
- _Init_timeinfo(this->_M_timeinfo, __time);
- _M_dateorder = __get_date_order(__time);
- __release_time(__time);
-}
-
-time_init<char>::time_init(_Locale_time *__time) {
- _Init_timeinfo(this->_M_timeinfo, __time);
- _M_dateorder = __get_date_order(__time);
-}
-
-#ifndef _STLP_NO_WCHAR_T
-time_init<wchar_t>::time_init()
- : _M_dateorder(time_base::no_order)
-{ _Init_timeinfo(_M_timeinfo); }
-
-time_init<wchar_t>::time_init(const char* __name) {
- if (!__name)
- locale::_M_throw_on_null_name();
-
- int __err_code;
- char buf[_Locale_MAX_SIMPLE_NAME];
- _Locale_time *__time = __acquire_time(__name, buf, 0, &__err_code);
- if (!__time)
- locale::_M_throw_on_creation_failure(__err_code, __name, "time");
-
- _Init_timeinfo(this->_M_timeinfo, __time);
- _M_dateorder = __get_date_order(__time);
- __release_time(__time);
-}
-
-time_init<wchar_t>::time_init(_Locale_time *__time) {
- _Init_timeinfo(this->_M_timeinfo, __time);
- _M_dateorder = __get_date_order(__time);
-}
-#endif
-
-_STLP_MOVE_TO_STD_NAMESPACE
-
-#if !defined (_STLP_NO_FORCE_INSTANTIATE)
-template class time_get<char, istreambuf_iterator<char, char_traits<char> > >;
-template class time_put<char, ostreambuf_iterator<char, char_traits<char> > >;
-
-# ifndef _STLP_NO_WCHAR_T
-template class time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
-template class time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
-# endif
-
-#endif
-
-_STLP_END_NAMESPACE