1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/ossrv/genericopenlibs/cppstdlib/stl/src/time_facets.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,511 @@
1.4 +/*
1.5 + * Portions Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
1.6 + *
1.7 + * Copyright (c) 1999
1.8 + * Silicon Graphics Computer Systems, Inc.
1.9 + *
1.10 + * Copyright (c) 1999
1.11 + * Boris Fomitchev
1.12 + *
1.13 + * This material is provided "as is", with absolutely no warranty expressed
1.14 + * or implied. Any use is at your own risk.
1.15 + *
1.16 + * Permission to use or copy this software for any purpose is hereby granted
1.17 + * without fee, provided the above notices are retained on all copies.
1.18 + * Permission to modify the code and to distribute modified code is granted,
1.19 + * provided the above notices are retained, and a notice that the code was
1.20 + * modified is included with the above copyright notice.
1.21 + *
1.22 + */
1.23 +
1.24 +#include "stlport_prefix.h"
1.25 +
1.26 +#include <cstdio>
1.27 +#include <locale>
1.28 +#include <istream>
1.29 +
1.30 +#ifndef __SYMBIAN32__
1.31 +#include <cstdio>
1.32 +#endif
1.33 +
1.34 +#include "c_locale.h"
1.35 +
1.36 +#ifdef __SYMBIAN32__WSD__
1.37 +#include <libstdcppwsd.h>
1.38 +#endif //__SYMBIAN32__WSD__
1.39 +
1.40 +_STLP_BEGIN_NAMESPACE
1.41 +
1.42 +_STLP_MOVE_TO_PRIV_NAMESPACE
1.43 +
1.44 +// default "C" values for month and day names
1.45 +
1.46 +const char default_dayname[][14] = {
1.47 + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
1.48 + "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
1.49 + "Friday", "Saturday"};
1.50 +
1.51 +const char default_monthname[][24] = {
1.52 + "Jan", "Feb", "Mar", "Apr", "May", "Jun",
1.53 + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
1.54 + "January", "February", "March", "April", "May", "June",
1.55 + "July", "August", "September", "October", "November", "December"};
1.56 +
1.57 +// _Init_time_info: initialize table with
1.58 +// "C" values (note these are not defined in the C standard, so this
1.59 +// is somewhat arbitrary).
1.60 +
1.61 +_STLP_DECLSPEC void _STLP_CALL _Init_timeinfo(_Time_Info& table) {
1.62 + int i;
1.63 + for (i = 0; i < 14; ++i)
1.64 + table._M_dayname[i] = default_dayname[i];
1.65 + for (i = 0; i < 24; ++i)
1.66 + table._M_monthname[i] = default_monthname[i];
1.67 + table._M_am_pm[0] = "AM";
1.68 + table._M_am_pm[1] = "PM";
1.69 + table._M_time_format = "%H:%M:%S";
1.70 + table._M_date_format = "%m/%d/%y";
1.71 + table._M_date_time_format = "%m/%d/%y";
1.72 +}
1.73 +
1.74 +_STLP_DECLSPEC void _STLP_CALL _Init_timeinfo(_Time_Info& table, _Locale_time * time) {
1.75 + if(!time)
1.76 + locale::_M_throw_runtime_error();
1.77 +
1.78 + int i;
1.79 + for (i = 0; i < 7; ++i)
1.80 + table._M_dayname[i] = _Locale_abbrev_dayofweek(time, i);
1.81 + for (i = 0; i < 7; ++i)
1.82 + table._M_dayname[i+7] = _Locale_full_dayofweek(time, i);
1.83 + for (i = 0; i < 12; ++i)
1.84 + table._M_monthname[i] = _Locale_abbrev_monthname(time, i);
1.85 + for (i = 0; i < 12; ++i)
1.86 + table._M_monthname[i+12] = _Locale_full_monthname(time, i);
1.87 + table._M_am_pm[0] = _Locale_am_str(time);
1.88 + table._M_am_pm[1] = _Locale_pm_str(time);
1.89 + table._M_time_format = _Locale_t_fmt(time);
1.90 + if ( table._M_time_format == "%T" ) {
1.91 + table._M_time_format = "%H:%M:%S";
1.92 + } else if ( table._M_time_format == "%r" ) {
1.93 + table._M_time_format = "%I:%M:%S %p";
1.94 + } else if ( table._M_time_format == "%R" ) {
1.95 + table._M_time_format = "%H:%M";
1.96 + }
1.97 + table._M_date_format = _Locale_d_fmt(time);
1.98 + table._M_date_time_format = _Locale_d_t_fmt(time);
1.99 + table._M_long_date_format = _Locale_long_d_fmt(time);
1.100 + table._M_long_date_time_format = _Locale_long_d_t_fmt(time);
1.101 +}
1.102 +
1.103 +inline char* __subformat(const string& format, char*& buf, size_t buf_size,
1.104 + const _Time_Info& table, const tm* t) {
1.105 + const char * cp = format.data();
1.106 + const char * cp_end = cp + format.size();
1.107 + while (cp != cp_end) {
1.108 + if (*cp == '%') {
1.109 + char mod = 0;
1.110 + ++cp;
1.111 + if(*cp == '#') {
1.112 + mod = *cp; ++cp;
1.113 + }
1.114 + char *former_buf = buf;
1.115 + buf = __write_formatted_time(buf, buf_size, *cp++, mod, table, t);
1.116 + buf_size -= (buf - former_buf);
1.117 + } else
1.118 + *buf++ = *cp++;
1.119 + }
1.120 + return buf;
1.121 +}
1.122 +
1.123 +#if defined (__GNUC__)
1.124 +/* The number of days from the first day of the first ISO week of this
1.125 + year to the year day YDAY with week day WDAY. ISO weeks start on
1.126 + Monday; the first ISO week has the year's first Thursday. YDAY may
1.127 + be as small as YDAY_MINIMUM. */
1.128 +# define __ISO_WEEK_START_WDAY 1 /* Monday */
1.129 +# define __ISO_WEEK1_WDAY 4 /* Thursday */
1.130 +# define __YDAY_MINIMUM (-366)
1.131 +# define __TM_YEAR_BASE 1900
1.132 +static int
1.133 +__iso_week_days(int yday, int wday) {
1.134 + /* Add enough to the first operand of % to make it nonnegative. */
1.135 + int big_enough_multiple_of_7 = (-__YDAY_MINIMUM / 7 + 2) * 7;
1.136 + return (yday
1.137 + - (yday - wday + __ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7
1.138 + + __ISO_WEEK1_WDAY - __ISO_WEEK_START_WDAY);
1.139 +}
1.140 +
1.141 +# define __is_leap(year)\
1.142 + ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
1.143 +
1.144 +#endif
1.145 +
1.146 +#define __hour12(hour) \
1.147 + (((hour) % 12 == 0) ? (12) : (hour) % 12)
1.148 +
1.149 +#if !defined (_STLP_USE_SAFE_STRING_FUNCTIONS)
1.150 +# define _STLP_SPRINTF(B, BS, F, D) sprintf(B, F, D)
1.151 +#else
1.152 +# define _STLP_SPRINTF(B, BS, F, D) sprintf_s(B, BS, F, D)
1.153 +#endif
1.154 +
1.155 +_STLP_DECLSPEC char * _STLP_CALL __write_formatted_time(char* buf, size_t buf_size, char format, char modifier,
1.156 + const _Time_Info& table, const tm* t) {
1.157 + switch (format) {
1.158 + case 'a':
1.159 + return copy(table._M_dayname[t->tm_wday].begin(),
1.160 + table._M_dayname[t->tm_wday].end(),
1.161 + buf);
1.162 +
1.163 + case 'A':
1.164 + return copy(table._M_dayname[t->tm_wday+7].begin(),
1.165 + table._M_dayname[t->tm_wday+7].end(),
1.166 + buf);
1.167 +
1.168 + case 'b':
1.169 + return copy(table._M_monthname[t->tm_mon].begin(),
1.170 + table._M_monthname[t->tm_mon].end(),
1.171 + buf);
1.172 +
1.173 + case 'B':
1.174 + return copy(table._M_monthname[t->tm_mon+12].begin(),
1.175 + table._M_monthname[t->tm_mon+12].end(),
1.176 + buf);
1.177 +
1.178 + case 'c': {
1.179 + const char *cp = (modifier != '#') ?
1.180 + table._M_date_time_format.data() :
1.181 + table._M_long_date_time_format.data();
1.182 + const char* cp_end = cp +
1.183 + ((modifier != '#') ? table._M_date_time_format.size() :
1.184 + table._M_long_date_time_format.size() );
1.185 + char mod;
1.186 + while (cp != cp_end) {
1.187 + if (*cp == '%') {
1.188 + ++cp; if(*cp == '#') mod = *cp++; else mod = 0;
1.189 + char *buf_pos = buf;
1.190 + buf = __write_formatted_time(buf, buf_size, *cp++, mod, table, t);
1.191 + buf_size -= (buf - buf_pos);
1.192 + }
1.193 + else {
1.194 + *buf++ = *cp++; --buf_size;
1.195 + }
1.196 + }
1.197 + return buf;
1.198 + }
1.199 +
1.200 + case 'd':
1.201 + _STLP_SPRINTF(buf, buf_size, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_mday);
1.202 + return ((long)t->tm_mday < 10L && modifier == '#')?buf+1:buf + 2;
1.203 +
1.204 + case 'e':
1.205 + _STLP_SPRINTF(buf, buf_size, "%2ld", (long)t->tm_mday);
1.206 + return buf + 2;
1.207 +
1.208 + case 'H':
1.209 + _STLP_SPRINTF(buf, buf_size, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_hour);
1.210 + return ((long)t->tm_hour < 10L && modifier == '#')?buf+1:buf + 2;
1.211 +
1.212 + case 'I':
1.213 + _STLP_SPRINTF(buf, buf_size, (modifier != '#')?"%.2ld":"%ld", (long)__hour12(t->tm_hour));
1.214 + return ((long)__hour12(t->tm_hour) < 10L && modifier == '#')?buf+1:buf + 2;
1.215 +
1.216 + case 'j':
1.217 + return __write_integer(buf, 0, (long)((long)t->tm_yday + 1));
1.218 +
1.219 + case 'm':
1.220 + _STLP_SPRINTF(buf, buf_size, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_mon + 1);
1.221 + return ((long)(t->tm_mon + 1) < 10L && modifier == '#')?buf+1:buf + 2;
1.222 +
1.223 + case 'M':
1.224 + _STLP_SPRINTF(buf, buf_size, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_min);
1.225 + return ((long)t->tm_min < 10L && modifier == '#')?buf+1:buf + 2;
1.226 +
1.227 + case 'p':
1.228 + return copy(table._M_am_pm[t->tm_hour/12].begin(),
1.229 + table._M_am_pm[t->tm_hour/12].end(),
1.230 + buf);
1.231 +
1.232 + case 'S': // pad with zeros
1.233 + _STLP_SPRINTF(buf, buf_size, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_sec);
1.234 + return ((long)t->tm_sec < 10L && modifier == '#')?buf+1:buf + 2;
1.235 +
1.236 + case 'U':
1.237 + return __write_integer(buf, 0,
1.238 + long((t->tm_yday - t->tm_wday + 7) / 7));
1.239 + // break;
1.240 +
1.241 + case 'w':
1.242 + return __write_integer(buf, 0, (long)t->tm_wday);
1.243 + // break;
1.244 +
1.245 + case 'W':
1.246 + return __write_integer(buf, 0,
1.247 + (long)(t->tm_wday == 0 ? (t->tm_yday + 1) / 7 :
1.248 + (t->tm_yday + 8 - t->tm_wday) / 7));
1.249 +
1.250 + case'x': {
1.251 + const char * cp = (modifier != '#') ? table._M_date_format.data():
1.252 + table._M_long_date_format.data();
1.253 + const char* cp_end = (modifier != '#') ? cp + table._M_date_format.size():
1.254 + cp + table._M_long_date_format.size();
1.255 + char mod;
1.256 + while (cp != cp_end) {
1.257 + if (*cp == '%') {
1.258 + ++cp; if(*cp == '#') mod = *cp++; else mod = 0;
1.259 + char *buf_pos = buf;
1.260 + buf = __write_formatted_time(buf, buf_size, *cp++, mod, table, t);
1.261 + buf_size -= (buf - buf_pos);
1.262 + }
1.263 + else {
1.264 + *buf++ = *cp++; --buf_size;
1.265 + }
1.266 + }
1.267 + return buf;
1.268 + }
1.269 +
1.270 + case 'X': {
1.271 + const char * cp = table._M_time_format.data();
1.272 + const char* cp_end = cp + table._M_time_format.size();
1.273 + char mod;
1.274 + while (cp != cp_end) {
1.275 + if (*cp == '%') {
1.276 + ++cp; if(*cp == '#') mod = *cp++; else mod = 0;
1.277 + char *buf_pos = buf;
1.278 + buf = __write_formatted_time(buf, buf_size, *cp++, mod, table, t);
1.279 + buf_size -= (buf - buf_pos);
1.280 + }
1.281 + else {
1.282 + *buf++ = *cp++; --buf_size;
1.283 + }
1.284 + }
1.285 + return buf;
1.286 + }
1.287 + case 'y':
1.288 + return __write_integer(buf, 0, (long)((long)(t->tm_year + 1900) % 100));
1.289 +
1.290 + case 'Y':
1.291 + return __write_integer(buf, 0, (long)((long)t->tm_year + 1900));
1.292 +
1.293 + case '%':
1.294 + *buf++ = '%';
1.295 + return buf;
1.296 +
1.297 +#if defined (__GNUC__)
1.298 + // fbp : at least on SUN
1.299 +# if defined (_STLP_UNIX) && !defined (__linux__)
1.300 +# define __USE_BSD 1
1.301 +# endif
1.302 +
1.303 + /*********************************************
1.304 + * JGS, handle various extensions *
1.305 + *********************************************/
1.306 +
1.307 + case 'h': /* POSIX.2 extension */
1.308 + // same as 'b', abbrev month name
1.309 + return copy(table._M_monthname[t->tm_mon].begin(),
1.310 + table._M_monthname[t->tm_mon].end(),
1.311 + buf);
1.312 +
1.313 + case 'C': /* POSIX.2 extension */
1.314 + // same as 'd', the day
1.315 + _STLP_SPRINTF(buf, buf_size, "%2ld", (long)t->tm_mday);
1.316 + return buf + 2;
1.317 +
1.318 + case 'D': /* POSIX.2 extension */
1.319 + // same as 'x'
1.320 + return __subformat(table._M_date_format, buf, buf_size, table, t);
1.321 +
1.322 + case 'k': /* GNU extension */
1.323 + _STLP_SPRINTF(buf, buf_size, "%2ld", (long)t->tm_hour);
1.324 + return buf + 2;
1.325 +
1.326 + case 'l': /* GNU extension */
1.327 + _STLP_SPRINTF(buf, buf_size, "%2ld", (long)t->tm_hour % 12);
1.328 + return buf + 2;
1.329 +
1.330 + case 'n': /* POSIX.2 extension */
1.331 + *buf++ = '\n';
1.332 + return buf;
1.333 +
1.334 + case 'R': /* GNU extension */
1.335 + return __subformat("%H:%M", buf, buf_size, table, t);
1.336 +
1.337 + case 'r': /* POSIX.2 extension */
1.338 + return __subformat("%I:%M:%S %p", buf, buf_size, table, t);
1.339 +
1.340 + case 'T': /* POSIX.2 extension. */
1.341 + return __subformat("%H:%M:%S", buf, buf_size, table, t);
1.342 +
1.343 + case 't': /* POSIX.2 extension. */
1.344 + *buf++ = '\t';
1.345 + return buf;
1.346 +
1.347 + case 'u': /* POSIX.2 extension. */
1.348 + return __write_integer(buf, 0, long((t->tm_wday - 1 + 7)) % 7 + 1);
1.349 +
1.350 + case 's': {
1.351 + time_t __t;
1.352 + __t = mktime(__CONST_CAST(tm*, t));
1.353 + return __write_integer(buf, 0, (long)__t );
1.354 + }
1.355 + case 'g': /* GNU extension */
1.356 + case 'G': {
1.357 + int year = t->tm_year + __TM_YEAR_BASE;
1.358 + int days = __iso_week_days (t->tm_yday, t->tm_wday);
1.359 + if (days < 0) {
1.360 + /* This ISO week belongs to the previous year. */
1.361 + year--;
1.362 + days = __iso_week_days (t->tm_yday + (365 + __is_leap (year)), t->tm_wday);
1.363 + }
1.364 + else {
1.365 + int d = __iso_week_days (t->tm_yday - (365 + __is_leap (year)), t->tm_wday);
1.366 + if (0 <= d) {
1.367 + /* This ISO week belongs to the next year. */
1.368 + ++year;
1.369 + days = d;
1.370 + }
1.371 + }
1.372 + switch (format) {
1.373 + case 'g':
1.374 + return __write_integer(buf, 0, (long)(year % 100 + 100) % 100);
1.375 + case 'G':
1.376 + return __write_integer(buf, 0, (long)year);
1.377 + default:
1.378 + return __write_integer(buf, 0, (long)days / 7 + 1);
1.379 + }
1.380 + }
1.381 +
1.382 +# if defined (_STLP_USE_GLIBC) && ! defined (__CYGWIN__)
1.383 + case 'z': /* GNU extension. */
1.384 + if (t->tm_isdst < 0)
1.385 + break;
1.386 + {
1.387 + int diff;
1.388 +# if defined (__USE_BSD) || defined (__BEOS__)
1.389 + diff = t->tm_gmtoff;
1.390 +# else
1.391 + diff = t->__tm_gmtoff;
1.392 +# endif
1.393 + if (diff < 0) {
1.394 + *buf++ = '-';
1.395 + diff = -diff;
1.396 + } else
1.397 + *buf++ = '+';
1.398 + diff /= 60;
1.399 + _STLP_SPRINTF(buf, buf_size, "%.4d", (diff / 60) * 100 + diff % 60);
1.400 + return buf + 4;
1.401 + }
1.402 +# endif /* __GLIBC__ */
1.403 +#endif /* __GNUC__ */
1.404 +
1.405 + default:
1.406 + // return buf;
1.407 + break;
1.408 + }
1.409 + return buf;
1.410 +}
1.411 +
1.412 +_STLP_DECLSPEC time_base::dateorder _STLP_CALL
1.413 +__get_date_order(_Locale_time* time) {
1.414 + const char * fmt = _Locale_d_fmt(time);
1.415 + char first, second, third;
1.416 +
1.417 + while (*fmt != 0 && *fmt != '%') ++fmt;
1.418 + if (*fmt == 0)
1.419 + return time_base::no_order;
1.420 + first = *++fmt;
1.421 + while (*fmt != 0 && *fmt != '%') ++fmt;
1.422 + if (*fmt == 0)
1.423 + return time_base::no_order;
1.424 + second = *++fmt;
1.425 + while (*fmt != 0 && *fmt != '%') ++fmt;
1.426 + if (*fmt == 0)
1.427 + return time_base::no_order;
1.428 + third = *++fmt;
1.429 +
1.430 + switch (first) {
1.431 + case 'd':
1.432 + return (second == 'm' && third == 'y') ? time_base::dmy
1.433 + : time_base::no_order;
1.434 + case 'm':
1.435 + return (second == 'd' && third == 'y') ? time_base::mdy
1.436 + : time_base::no_order;
1.437 + case 'y':
1.438 + switch (second) {
1.439 + case 'd':
1.440 + return third == 'm' ? time_base::ydm : time_base::no_order;
1.441 + case 'm':
1.442 + return third == 'd' ? time_base::ymd : time_base::no_order;
1.443 + default:
1.444 + return time_base::no_order;
1.445 + }
1.446 + default:
1.447 + return time_base::no_order;
1.448 + }
1.449 +}
1.450 +
1.451 +_STLP_MOVE_TO_STD_NAMESPACE
1.452 +
1.453 +
1.454 +#if defined (__SYMBIAN32__WSD__)
1.455 +
1.456 +template <>
1.457 +_STLP_DECLSPEC locale::id&
1.458 +time_get<char, istreambuf_iterator<char, char_traits<char> > >::GetFacetLocaleId()
1.459 + {
1.460 + return get_libcpp_wsd().time_get_char_istreambuf_iterator_id;
1.461 + }
1.462 +template <>
1.463 +_STLP_DECLSPEC locale::id&
1.464 +time_put<char, ostreambuf_iterator<char, char_traits<char> > >::GetFacetLocaleId()
1.465 + {
1.466 + return get_libcpp_wsd().time_put_char_ostreambuf_iterator_id;
1.467 + }
1.468 +# ifndef _STLP_NO_WCHAR_T
1.469 +template <>
1.470 +_STLP_DECLSPEC locale::id&
1.471 +time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::GetFacetLocaleId()
1.472 + {
1.473 + return get_libcpp_wsd().time_get_wchar_istreambuf_iterator_id;
1.474 + }
1.475 +template <>
1.476 +_STLP_DECLSPEC locale::id&
1.477 +time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::GetFacetLocaleId()
1.478 + {
1.479 + return get_libcpp_wsd().time_put_wchar_ostreambuf_iterator_id;
1.480 + }
1.481 +# endif /* _STLP_NO_WCHAR_T */
1.482 +#endif /* __SYMBIAN32__WSD__ */
1.483 +
1.484 +
1.485 +#if !defined(_STLP_NO_FORCE_INSTANTIATE)
1.486 +template class time_get<char, istreambuf_iterator<char, char_traits<char> > >;
1.487 +template class time_put<char, ostreambuf_iterator<char, char_traits<char> > >;
1.488 +
1.489 +# if !defined (_STLP_NO_WCHAR_T)
1.490 +template class time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
1.491 +template class time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
1.492 +# endif
1.493 +
1.494 +#endif
1.495 +
1.496 +#if defined(__EPOC32__)
1.497 +
1.498 +template <>
1.499 +locale::id time_get<char, istreambuf_iterator<char, char_traits<char> > >::id={16};
1.500 +
1.501 +template <>
1.502 +locale::id time_put<char, ostreambuf_iterator<char, char_traits<char> > >::id={18};
1.503 +
1.504 +# ifndef _STLP_NO_WCHAR_T
1.505 +template <>
1.506 +locale::id time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id={35};
1.507 +
1.508 +template <>
1.509 +locale::id time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id={37};
1.510 +# endif
1.511 +
1.512 +#endif // __EPOC32__
1.513 +
1.514 +_STLP_END_NAMESPACE