First public contribution.
2 * Portions Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
5 * Silicon Graphics Computer Systems, Inc.
10 * This material is provided "as is", with absolutely no warranty expressed
11 * or implied. Any use is at your own risk.
13 * Permission to use or copy this software for any purpose is hereby granted
14 * without fee, provided the above notices are retained on all copies.
15 * Permission to modify the code and to distribute modified code is granted,
16 * provided the above notices are retained, and a notice that the code was
17 * modified is included with the above copyright notice.
21 #include "stlport_prefix.h"
33 #ifdef __SYMBIAN32__WSD__
34 #include <libstdcppwsd.h>
35 #endif //__SYMBIAN32__WSD__
39 _STLP_MOVE_TO_PRIV_NAMESPACE
41 // default "C" values for month and day names
43 const char default_dayname[][14] = {
44 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
45 "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
46 "Friday", "Saturday"};
48 const char default_monthname[][24] = {
49 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
50 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
51 "January", "February", "March", "April", "May", "June",
52 "July", "August", "September", "October", "November", "December"};
54 // _Init_time_info: initialize table with
55 // "C" values (note these are not defined in the C standard, so this
56 // is somewhat arbitrary).
58 _STLP_DECLSPEC void _STLP_CALL _Init_timeinfo(_Time_Info& table) {
60 for (i = 0; i < 14; ++i)
61 table._M_dayname[i] = default_dayname[i];
62 for (i = 0; i < 24; ++i)
63 table._M_monthname[i] = default_monthname[i];
64 table._M_am_pm[0] = "AM";
65 table._M_am_pm[1] = "PM";
66 table._M_time_format = "%H:%M:%S";
67 table._M_date_format = "%m/%d/%y";
68 table._M_date_time_format = "%m/%d/%y";
71 _STLP_DECLSPEC void _STLP_CALL _Init_timeinfo(_Time_Info& table, _Locale_time * time) {
73 locale::_M_throw_runtime_error();
76 for (i = 0; i < 7; ++i)
77 table._M_dayname[i] = _Locale_abbrev_dayofweek(time, i);
78 for (i = 0; i < 7; ++i)
79 table._M_dayname[i+7] = _Locale_full_dayofweek(time, i);
80 for (i = 0; i < 12; ++i)
81 table._M_monthname[i] = _Locale_abbrev_monthname(time, i);
82 for (i = 0; i < 12; ++i)
83 table._M_monthname[i+12] = _Locale_full_monthname(time, i);
84 table._M_am_pm[0] = _Locale_am_str(time);
85 table._M_am_pm[1] = _Locale_pm_str(time);
86 table._M_time_format = _Locale_t_fmt(time);
87 if ( table._M_time_format == "%T" ) {
88 table._M_time_format = "%H:%M:%S";
89 } else if ( table._M_time_format == "%r" ) {
90 table._M_time_format = "%I:%M:%S %p";
91 } else if ( table._M_time_format == "%R" ) {
92 table._M_time_format = "%H:%M";
94 table._M_date_format = _Locale_d_fmt(time);
95 table._M_date_time_format = _Locale_d_t_fmt(time);
96 table._M_long_date_format = _Locale_long_d_fmt(time);
97 table._M_long_date_time_format = _Locale_long_d_t_fmt(time);
100 inline char* __subformat(const string& format, char*& buf, size_t buf_size,
101 const _Time_Info& table, const tm* t) {
102 const char * cp = format.data();
103 const char * cp_end = cp + format.size();
104 while (cp != cp_end) {
111 char *former_buf = buf;
112 buf = __write_formatted_time(buf, buf_size, *cp++, mod, table, t);
113 buf_size -= (buf - former_buf);
120 #if defined (__GNUC__)
121 /* The number of days from the first day of the first ISO week of this
122 year to the year day YDAY with week day WDAY. ISO weeks start on
123 Monday; the first ISO week has the year's first Thursday. YDAY may
124 be as small as YDAY_MINIMUM. */
125 # define __ISO_WEEK_START_WDAY 1 /* Monday */
126 # define __ISO_WEEK1_WDAY 4 /* Thursday */
127 # define __YDAY_MINIMUM (-366)
128 # define __TM_YEAR_BASE 1900
130 __iso_week_days(int yday, int wday) {
131 /* Add enough to the first operand of % to make it nonnegative. */
132 int big_enough_multiple_of_7 = (-__YDAY_MINIMUM / 7 + 2) * 7;
134 - (yday - wday + __ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7
135 + __ISO_WEEK1_WDAY - __ISO_WEEK_START_WDAY);
138 # define __is_leap(year)\
139 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
143 #define __hour12(hour) \
144 (((hour) % 12 == 0) ? (12) : (hour) % 12)
146 #if !defined (_STLP_USE_SAFE_STRING_FUNCTIONS)
147 # define _STLP_SPRINTF(B, BS, F, D) sprintf(B, F, D)
149 # define _STLP_SPRINTF(B, BS, F, D) sprintf_s(B, BS, F, D)
152 _STLP_DECLSPEC char * _STLP_CALL __write_formatted_time(char* buf, size_t buf_size, char format, char modifier,
153 const _Time_Info& table, const tm* t) {
156 return copy(table._M_dayname[t->tm_wday].begin(),
157 table._M_dayname[t->tm_wday].end(),
161 return copy(table._M_dayname[t->tm_wday+7].begin(),
162 table._M_dayname[t->tm_wday+7].end(),
166 return copy(table._M_monthname[t->tm_mon].begin(),
167 table._M_monthname[t->tm_mon].end(),
171 return copy(table._M_monthname[t->tm_mon+12].begin(),
172 table._M_monthname[t->tm_mon+12].end(),
176 const char *cp = (modifier != '#') ?
177 table._M_date_time_format.data() :
178 table._M_long_date_time_format.data();
179 const char* cp_end = cp +
180 ((modifier != '#') ? table._M_date_time_format.size() :
181 table._M_long_date_time_format.size() );
183 while (cp != cp_end) {
185 ++cp; if(*cp == '#') mod = *cp++; else mod = 0;
187 buf = __write_formatted_time(buf, buf_size, *cp++, mod, table, t);
188 buf_size -= (buf - buf_pos);
191 *buf++ = *cp++; --buf_size;
198 _STLP_SPRINTF(buf, buf_size, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_mday);
199 return ((long)t->tm_mday < 10L && modifier == '#')?buf+1:buf + 2;
202 _STLP_SPRINTF(buf, buf_size, "%2ld", (long)t->tm_mday);
206 _STLP_SPRINTF(buf, buf_size, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_hour);
207 return ((long)t->tm_hour < 10L && modifier == '#')?buf+1:buf + 2;
210 _STLP_SPRINTF(buf, buf_size, (modifier != '#')?"%.2ld":"%ld", (long)__hour12(t->tm_hour));
211 return ((long)__hour12(t->tm_hour) < 10L && modifier == '#')?buf+1:buf + 2;
214 return __write_integer(buf, 0, (long)((long)t->tm_yday + 1));
217 _STLP_SPRINTF(buf, buf_size, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_mon + 1);
218 return ((long)(t->tm_mon + 1) < 10L && modifier == '#')?buf+1:buf + 2;
221 _STLP_SPRINTF(buf, buf_size, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_min);
222 return ((long)t->tm_min < 10L && modifier == '#')?buf+1:buf + 2;
225 return copy(table._M_am_pm[t->tm_hour/12].begin(),
226 table._M_am_pm[t->tm_hour/12].end(),
229 case 'S': // pad with zeros
230 _STLP_SPRINTF(buf, buf_size, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_sec);
231 return ((long)t->tm_sec < 10L && modifier == '#')?buf+1:buf + 2;
234 return __write_integer(buf, 0,
235 long((t->tm_yday - t->tm_wday + 7) / 7));
239 return __write_integer(buf, 0, (long)t->tm_wday);
243 return __write_integer(buf, 0,
244 (long)(t->tm_wday == 0 ? (t->tm_yday + 1) / 7 :
245 (t->tm_yday + 8 - t->tm_wday) / 7));
248 const char * cp = (modifier != '#') ? table._M_date_format.data():
249 table._M_long_date_format.data();
250 const char* cp_end = (modifier != '#') ? cp + table._M_date_format.size():
251 cp + table._M_long_date_format.size();
253 while (cp != cp_end) {
255 ++cp; if(*cp == '#') mod = *cp++; else mod = 0;
257 buf = __write_formatted_time(buf, buf_size, *cp++, mod, table, t);
258 buf_size -= (buf - buf_pos);
261 *buf++ = *cp++; --buf_size;
268 const char * cp = table._M_time_format.data();
269 const char* cp_end = cp + table._M_time_format.size();
271 while (cp != cp_end) {
273 ++cp; if(*cp == '#') mod = *cp++; else mod = 0;
275 buf = __write_formatted_time(buf, buf_size, *cp++, mod, table, t);
276 buf_size -= (buf - buf_pos);
279 *buf++ = *cp++; --buf_size;
285 return __write_integer(buf, 0, (long)((long)(t->tm_year + 1900) % 100));
288 return __write_integer(buf, 0, (long)((long)t->tm_year + 1900));
294 #if defined (__GNUC__)
295 // fbp : at least on SUN
296 # if defined (_STLP_UNIX) && !defined (__linux__)
300 /*********************************************
301 * JGS, handle various extensions *
302 *********************************************/
304 case 'h': /* POSIX.2 extension */
305 // same as 'b', abbrev month name
306 return copy(table._M_monthname[t->tm_mon].begin(),
307 table._M_monthname[t->tm_mon].end(),
310 case 'C': /* POSIX.2 extension */
311 // same as 'd', the day
312 _STLP_SPRINTF(buf, buf_size, "%2ld", (long)t->tm_mday);
315 case 'D': /* POSIX.2 extension */
317 return __subformat(table._M_date_format, buf, buf_size, table, t);
319 case 'k': /* GNU extension */
320 _STLP_SPRINTF(buf, buf_size, "%2ld", (long)t->tm_hour);
323 case 'l': /* GNU extension */
324 _STLP_SPRINTF(buf, buf_size, "%2ld", (long)t->tm_hour % 12);
327 case 'n': /* POSIX.2 extension */
331 case 'R': /* GNU extension */
332 return __subformat("%H:%M", buf, buf_size, table, t);
334 case 'r': /* POSIX.2 extension */
335 return __subformat("%I:%M:%S %p", buf, buf_size, table, t);
337 case 'T': /* POSIX.2 extension. */
338 return __subformat("%H:%M:%S", buf, buf_size, table, t);
340 case 't': /* POSIX.2 extension. */
344 case 'u': /* POSIX.2 extension. */
345 return __write_integer(buf, 0, long((t->tm_wday - 1 + 7)) % 7 + 1);
349 __t = mktime(__CONST_CAST(tm*, t));
350 return __write_integer(buf, 0, (long)__t );
352 case 'g': /* GNU extension */
354 int year = t->tm_year + __TM_YEAR_BASE;
355 int days = __iso_week_days (t->tm_yday, t->tm_wday);
357 /* This ISO week belongs to the previous year. */
359 days = __iso_week_days (t->tm_yday + (365 + __is_leap (year)), t->tm_wday);
362 int d = __iso_week_days (t->tm_yday - (365 + __is_leap (year)), t->tm_wday);
364 /* This ISO week belongs to the next year. */
371 return __write_integer(buf, 0, (long)(year % 100 + 100) % 100);
373 return __write_integer(buf, 0, (long)year);
375 return __write_integer(buf, 0, (long)days / 7 + 1);
379 # if defined (_STLP_USE_GLIBC) && ! defined (__CYGWIN__)
380 case 'z': /* GNU extension. */
385 # if defined (__USE_BSD) || defined (__BEOS__)
388 diff = t->__tm_gmtoff;
396 _STLP_SPRINTF(buf, buf_size, "%.4d", (diff / 60) * 100 + diff % 60);
399 # endif /* __GLIBC__ */
400 #endif /* __GNUC__ */
409 _STLP_DECLSPEC time_base::dateorder _STLP_CALL
410 __get_date_order(_Locale_time* time) {
411 const char * fmt = _Locale_d_fmt(time);
412 char first, second, third;
414 while (*fmt != 0 && *fmt != '%') ++fmt;
416 return time_base::no_order;
418 while (*fmt != 0 && *fmt != '%') ++fmt;
420 return time_base::no_order;
422 while (*fmt != 0 && *fmt != '%') ++fmt;
424 return time_base::no_order;
429 return (second == 'm' && third == 'y') ? time_base::dmy
430 : time_base::no_order;
432 return (second == 'd' && third == 'y') ? time_base::mdy
433 : time_base::no_order;
437 return third == 'm' ? time_base::ydm : time_base::no_order;
439 return third == 'd' ? time_base::ymd : time_base::no_order;
441 return time_base::no_order;
444 return time_base::no_order;
448 _STLP_MOVE_TO_STD_NAMESPACE
451 #if defined (__SYMBIAN32__WSD__)
454 _STLP_DECLSPEC locale::id&
455 time_get<char, istreambuf_iterator<char, char_traits<char> > >::GetFacetLocaleId()
457 return get_libcpp_wsd().time_get_char_istreambuf_iterator_id;
460 _STLP_DECLSPEC locale::id&
461 time_put<char, ostreambuf_iterator<char, char_traits<char> > >::GetFacetLocaleId()
463 return get_libcpp_wsd().time_put_char_ostreambuf_iterator_id;
465 # ifndef _STLP_NO_WCHAR_T
467 _STLP_DECLSPEC locale::id&
468 time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::GetFacetLocaleId()
470 return get_libcpp_wsd().time_get_wchar_istreambuf_iterator_id;
473 _STLP_DECLSPEC locale::id&
474 time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::GetFacetLocaleId()
476 return get_libcpp_wsd().time_put_wchar_ostreambuf_iterator_id;
478 # endif /* _STLP_NO_WCHAR_T */
479 #endif /* __SYMBIAN32__WSD__ */
482 #if !defined(_STLP_NO_FORCE_INSTANTIATE)
483 template class time_get<char, istreambuf_iterator<char, char_traits<char> > >;
484 template class time_put<char, ostreambuf_iterator<char, char_traits<char> > >;
486 # if !defined (_STLP_NO_WCHAR_T)
487 template class time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
488 template class time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
493 #if defined(__EPOC32__)
496 locale::id time_get<char, istreambuf_iterator<char, char_traits<char> > >::id={16};
499 locale::id time_put<char, ostreambuf_iterator<char, char_traits<char> > >::id={18};
501 # ifndef _STLP_NO_WCHAR_T
503 locale::id time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id={35};
506 locale::id time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id={37};