From 8f88da406bc8c03775e15b4f7d2c8bc201cffb4e Mon Sep 17 00:00:00 2001 From: Benjamin Kosnik Date: Tue, 15 Jan 2002 04:23:46 +0000 Subject: [PATCH] locale_facets.tcc (time_put::put): Correct output iterator positions. 2002-01-14 Benjamin Kosnik * include/bits/locale_facets.tcc (time_put::put): Correct output iterator positions. * testsuite/22_locale/time_put_members_char.cc (test02): Add. * testsuite/22_locale/time_put_members_wchar_t.cc (test02): Add. * testsuite/22_locale/time_get_members_wchar_t.cc (test06): Add. * testsuite/22_locale/time_get_members_char.cc (test06): Add. From-SVN: r48861 --- libstdc++-v3/ChangeLog | 9 ++ libstdc++-v3/include/bits/locale_facets.tcc | 18 ++-- .../22_locale/money_put_members_char.cc | 1 - .../22_locale/time_get_members_char.cc | 91 ++++++++++++++++++- .../22_locale/time_get_members_wchar_t.cc | 91 ++++++++++++++++++- .../22_locale/time_put_members_char.cc | 46 +++++++++- .../22_locale/time_put_members_wchar_t.cc | 46 +++++++++- 7 files changed, 290 insertions(+), 12 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 383bb751da1..0394ed1f274 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2002-01-14 Benjamin Kosnik + + * include/bits/locale_facets.tcc (time_put::put): Correct output + iterator positions. + * testsuite/22_locale/time_put_members_char.cc (test02): Add. + * testsuite/22_locale/time_put_members_wchar_t.cc (test02): Add. + * testsuite/22_locale/time_get_members_wchar_t.cc (test06): Add. + * testsuite/22_locale/time_get_members_char.cc (test06): Add. + 2002-01-14 Craig Rodrigues * docs/html/17_intro/porting-howto.xml: Update filebuf section. diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 396f4236c4c..57cab783fe6 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -1516,13 +1516,13 @@ namespace std break; case 'I': // Hour [01, 12]. [tm_hour] - _M_extract_num(__beg, __end, __tm->tm_hour, 1, 12, 2, + _M_extract_num(__beg, __end, __tm->tm_hour, 1, 12, 2, __ctype, __err); break; case 'm': // Month [01, 12]. [tm_mon] - _M_extract_num(__beg, __end, __mem, 1, 12, 2, - __ctype, __err); + _M_extract_num(__beg, __end, __mem, 1, 12, 2, __ctype, + __err); if (!__err) __tm->tm_mon = __mem - 1; break; @@ -1905,10 +1905,14 @@ namespace std } else __format = __c; - this->do_put(__s, __io, char_type(), __tm, __format, __mod); + __s = this->do_put(__s, __io, char_type(), __tm, __format, + __mod); } else - __s = __c; + { + *__s = __c; + ++__s; + } } return __s; } @@ -1951,8 +1955,8 @@ namespace std // Write resulting, fully-formatted string to output iterator. size_t __len = char_traits::length(__res); - for (size_t __i = 0; __i < __len; ++__i) - __s = __res[__i]; + for (size_t __i = 0; __i < __len; ++__i, ++__s) + *__s = __res[__i]; return __s; } diff --git a/libstdc++-v3/testsuite/22_locale/money_put_members_char.cc b/libstdc++-v3/testsuite/22_locale/money_put_members_char.cc index 3c318cec211..3c5ef00edae 100644 --- a/libstdc++-v3/testsuite/22_locale/money_put_members_char.cc +++ b/libstdc++-v3/testsuite/22_locale/money_put_members_char.cc @@ -290,4 +290,3 @@ int main() test03(); return 0; } - diff --git a/libstdc++-v3/testsuite/22_locale/time_get_members_char.cc b/libstdc++-v3/testsuite/22_locale/time_get_members_char.cc index b477ba22317..2b69be3317a 100644 --- a/libstdc++-v3/testsuite/22_locale/time_get_members_char.cc +++ b/libstdc++-v3/testsuite/22_locale/time_get_members_char.cc @@ -1,6 +1,6 @@ // 2001-09-21 Benjamin Kosnik -// Copyright (C) 2001 Free Software Foundation +// Copyright (C) 2001-2002 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -585,6 +585,93 @@ void test05() VERIFY( errorstate == ios_base::eofbit ); } +void test06() +{ + using namespace std; + bool test = true; + + // Check time_get works with other iterators besides streambuf + // input iterators. + typedef string::const_iterator iter_type; + typedef time_get time_get_type; + const ios_base::iostate goodbit = ios_base::goodbit; + const ios_base::iostate eofbit = ios_base::eofbit; + ios_base::iostate err = goodbit; + const locale loc_c = locale::classic(); + // Cindy Sherman's Untitled Film Stills + // June 26-September 2, 1997 + const string str = "12:00:00 06/26/97 Tuesday September 1997 Cindy Sherman"; + + // Create "C" time objects + const tm time_sanity = { 0, 0, 12, 26, 5, 97, 2 }; + tm tm1; + + istringstream iss; + iss.imbue(locale(loc_c, new time_get_type)); + + // Iterator advanced, state, output. + const time_get_type& tg = use_facet(iss.getloc()); + + // 01 get_time + // 02 get_date + // 03 get_weekday + // 04 get_monthname + // 05 get_year + + // 01 get_time + string res1; + err = goodbit; + iter_type end1 = tg.get_time(str.begin(), str.end(), iss, err, &tm1); + string rem1(end1, str.end()); + VERIFY( err == goodbit ); + VERIFY( tm1.tm_sec == time_sanity.tm_sec ); + VERIFY( tm1.tm_min == time_sanity.tm_min ); + VERIFY( tm1.tm_hour == time_sanity.tm_hour ); + VERIFY( rem1 == " 06/26/97 Tuesday September 1997 Cindy Sherman" ); + + // 02 get_date + string res2; + err = goodbit; + // White space is not eaten, so manually increment past it. + iter_type end2 = tg.get_date(++end1, str.end(), iss, err, &tm1); + string rem2(end2, str.end()); + VERIFY( err == goodbit ); + VERIFY( tm1.tm_year == time_sanity.tm_year ); + VERIFY( tm1.tm_mon == time_sanity.tm_mon ); + VERIFY( tm1.tm_mday == time_sanity.tm_mday ); + VERIFY( rem2 == " Tuesday September 1997 Cindy Sherman" ); + + // 03 get_weekday + string res3; + err = goodbit; + // White space is not eaten, so manually increment past it. + iter_type end3 = tg.get_weekday(++end2, str.end(), iss, err, &tm1); + string rem3(end3, str.end()); + VERIFY( err == goodbit ); + VERIFY( tm1.tm_wday == time_sanity.tm_wday ); + VERIFY( rem3 == " September 1997 Cindy Sherman" ); + + // 04 get_monthname + string res4; + err = goodbit; + // White space is not eaten, so manually increment past it. + iter_type end4 = tg.get_monthname(++end3, str.end(), iss, err, &tm1); + string rem4(end4, str.end()); + VERIFY( err == goodbit ); + VERIFY( tm1.tm_mon == 8 ); + VERIFY( rem4 == " 1997 Cindy Sherman" ); + + // 05 get_year + string res5; + err = goodbit; + // White space is not eaten, so manually increment past it. + iter_type end5 = tg.get_year(++end4, str.end(), iss, err, &tm1); + string rem5(end5, str.end()); + VERIFY( err == goodbit ); + VERIFY( tm1.tm_year == time_sanity.tm_year ); + VERIFY( rem5 == " Cindy Sherman" ); +} + int main() { test01(); @@ -592,5 +679,7 @@ int main() test03(); test04(); test05(); + + test06(); return 0; } diff --git a/libstdc++-v3/testsuite/22_locale/time_get_members_wchar_t.cc b/libstdc++-v3/testsuite/22_locale/time_get_members_wchar_t.cc index dfddc0325c5..298d85a12c5 100644 --- a/libstdc++-v3/testsuite/22_locale/time_get_members_wchar_t.cc +++ b/libstdc++-v3/testsuite/22_locale/time_get_members_wchar_t.cc @@ -1,6 +1,6 @@ // 2001-10-02 Benjamin Kosnik -// Copyright (C) 2001 Free Software Foundation +// Copyright (C) 2001-2002 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -584,6 +584,93 @@ void test05() VERIFY( time20.tm_year == time_bday.tm_year ); VERIFY( errorstate == ios_base::eofbit ); } + +void test06() +{ + using namespace std; + bool test = true; + + // Check time_get works with other iterators besides streambuf + // input iterators. + typedef wstring::const_iterator iter_type; + typedef time_get time_get_type; + const ios_base::iostate goodbit = ios_base::goodbit; + const ios_base::iostate eofbit = ios_base::eofbit; + ios_base::iostate err = goodbit; + const locale loc_c = locale::classic(); + // Cindy Sherman's Untitled Film Stills + // June 26-September 2, 1997 + const wstring str = L"12:00:00 06/26/97 Tuesday September 1997 Cindy Sherman"; + + // Create "C" time objects + const tm time_sanity = { 0, 0, 12, 26, 5, 97, 2 }; + tm tm1; + + wistringstream iss; + iss.imbue(locale(loc_c, new time_get_type)); + + // Iterator advanced, state, output. + const time_get_type& tg = use_facet(iss.getloc()); + + // 01 get_time + // 02 get_date + // 03 get_weekday + // 04 get_monthname + // 05 get_year + + // 01 get_time + wstring res1; + err = goodbit; + iter_type end1 = tg.get_time(str.begin(), str.end(), iss, err, &tm1); + wstring rem1(end1, str.end()); + VERIFY( err == goodbit ); + VERIFY( tm1.tm_sec == time_sanity.tm_sec ); + VERIFY( tm1.tm_min == time_sanity.tm_min ); + VERIFY( tm1.tm_hour == time_sanity.tm_hour ); + VERIFY( rem1 == L" 06/26/97 Tuesday September 1997 Cindy Sherman" ); + + // 02 get_date + wstring res2; + err = goodbit; + // White space is not eaten, so manually increment past it. + iter_type end2 = tg.get_date(++end1, str.end(), iss, err, &tm1); + wstring rem2(end2, str.end()); + VERIFY( err == goodbit ); + VERIFY( tm1.tm_year == time_sanity.tm_year ); + VERIFY( tm1.tm_mon == time_sanity.tm_mon ); + VERIFY( tm1.tm_mday == time_sanity.tm_mday ); + VERIFY( rem2 == L" Tuesday September 1997 Cindy Sherman" ); + + // 03 get_weekday + wstring res3; + err = goodbit; + // White space is not eaten, so manually increment past it. + iter_type end3 = tg.get_weekday(++end2, str.end(), iss, err, &tm1); + wstring rem3(end3, str.end()); + VERIFY( err == goodbit ); + VERIFY( tm1.tm_wday == time_sanity.tm_wday ); + VERIFY( rem3 == L" September 1997 Cindy Sherman" ); + + // 04 get_monthname + wstring res4; + err = goodbit; + // White space is not eaten, so manually increment past it. + iter_type end4 = tg.get_monthname(++end3, str.end(), iss, err, &tm1); + wstring rem4(end4, str.end()); + VERIFY( err == goodbit ); + VERIFY( tm1.tm_mon == 8 ); + VERIFY( rem4 == L" 1997 Cindy Sherman" ); + + // 05 get_year + wstring res5; + err = goodbit; + // White space is not eaten, so manually increment past it. + iter_type end5 = tg.get_year(++end4, str.end(), iss, err, &tm1); + wstring rem5(end5, str.end()); + VERIFY( err == goodbit ); + VERIFY( tm1.tm_year == time_sanity.tm_year ); + VERIFY( rem5 == L" Cindy Sherman" ); +} #endif int main() @@ -594,6 +681,8 @@ int main() test03(); test04(); test05(); + + test06(); #endif return 0; } diff --git a/libstdc++-v3/testsuite/22_locale/time_put_members_char.cc b/libstdc++-v3/testsuite/22_locale/time_put_members_char.cc index c751cbd3984..96d24fc041e 100644 --- a/libstdc++-v3/testsuite/22_locale/time_put_members_char.cc +++ b/libstdc++-v3/testsuite/22_locale/time_put_members_char.cc @@ -1,6 +1,6 @@ // 2001-09-17 Benjamin Kosnik -// Copyright (C) 2001 Free Software Foundation +// Copyright (C) 2001-2002 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -188,8 +188,52 @@ void test01() VERIFY( result12 != result11 ); } +void test02() +{ + using namespace std; + bool test = true; + + // Check time_put works with other iterators besides streambuf + // output iterators. (As long as output_iterator requirements are met.) + typedef string::iterator iter_type; + typedef char_traits traits; + typedef time_put time_put_type; + const ios_base::iostate goodbit = ios_base::goodbit; + const ios_base::iostate eofbit = ios_base::eofbit; + ios_base::iostate err = goodbit; + const locale loc_c = locale::classic(); + const string x(50, 'x'); // have to have allocated string! + string res; + const tm time_sanity = { 0, 0, 12, 26, 5, 97, 2 }; + const char* date = "%X, %A, the second of %B, %Y"; + + ostringstream oss; + oss.imbue(locale(loc_c, new time_put_type)); + + // Iterator advanced, state, output. + const time_put_type& tp = use_facet(oss.getloc()); + + // 01 date format + res = x; + iter_type ret1 = tp.put(res.begin(), oss, ' ', &time_sanity, + date, date + traits::length(date)); + string sanity1(res.begin(), ret1); + VERIFY( err == goodbit ); + VERIFY( res == "12:00:00, Tuesday, the second of June, 1997xxxxxxx" ); + VERIFY( sanity1 == "12:00:00, Tuesday, the second of June, 1997" ); + + // 02 char format + res = x; + iter_type ret2 = tp.put(res.begin(), oss, ' ', &time_sanity, 'A'); + string sanity2(res.begin(), ret2); + VERIFY( err == goodbit ); + VERIFY( res == "Tuesdayxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ); + VERIFY( sanity2 == "Tuesday" ); +} + int main() { test01(); + test02(); return 0; } diff --git a/libstdc++-v3/testsuite/22_locale/time_put_members_wchar_t.cc b/libstdc++-v3/testsuite/22_locale/time_put_members_wchar_t.cc index cde8bd4baa3..48543b7132d 100644 --- a/libstdc++-v3/testsuite/22_locale/time_put_members_wchar_t.cc +++ b/libstdc++-v3/testsuite/22_locale/time_put_members_wchar_t.cc @@ -1,6 +1,6 @@ // 2001-10-02 Benjamin Kosnik -// Copyright (C) 2001 Free Software Foundation +// Copyright (C) 2001-2002 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -189,12 +189,56 @@ void test01() wstring result12 = oss.str(); VERIFY( result12 != result11 ); } + +void test02() +{ + using namespace std; + bool test = true; + + // Check time_put works with other iterators besides streambuf + // output iterators. (As long as output_iterator requirements are met.) + typedef wstring::iterator iter_type; + typedef char_traits traits; + typedef time_put time_put_type; + const ios_base::iostate goodbit = ios_base::goodbit; + const ios_base::iostate eofbit = ios_base::eofbit; + ios_base::iostate err = goodbit; + const locale loc_c = locale::classic(); + const wstring x(50, L'x'); // have to have allocated string! + wstring res; + const tm time_sanity = { 0, 0, 12, 26, 5, 97, 2 }; + const wchar_t* date = L"%X, %A, the second of %B, %Y"; + + ostringstream oss; + oss.imbue(locale(loc_c, new time_put_type)); + + // Iterator advanced, state, output. + const time_put_type& tp = use_facet(oss.getloc()); + + // 01 date format + res = x; + iter_type ret1 = tp.put(res.begin(), oss, L' ', &time_sanity, + date, date + traits::length(date)); + wstring sanity1(res.begin(), ret1); + VERIFY( err == goodbit ); + VERIFY( res == L"12:00:00, Tuesday, the second of June, 1997xxxxxxx" ); + VERIFY( sanity1 == L"12:00:00, Tuesday, the second of June, 1997" ); + + // 02 char format + res = x; + iter_type ret2 = tp.put(res.begin(), oss, L' ', &time_sanity, 'A'); + wstring sanity2(res.begin(), ret2); + VERIFY( err == goodbit ); + VERIFY( res == L"Tuesdayxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ); + VERIFY( sanity2 == L"Tuesday" ); +} #endif int main() { #ifdef _GLIBCPP_USE_WCHAR_T test01(); + test02(); #endif return 0; }