mirror of git://gcc.gnu.org/git/gcc.git
re PR libstdc++/60396 (Missing time_get<>::get() functions)
2014-12-22 Rüdiger Sonderfeld <ruediger@c-plusplus.de> Jonathan Wakely <jwakely@redhat.com> PR libstdc++/60396 * config/abi/pre/gnu.ver: Add new exports. * include/bits/locale_facets_nonio.h (time_get::get): New overloads. (time_get::do_get): New virtual function. * include/bits/locale_facets_nonio.tcc (time_get::get): Define. (time_get::do_get): Define. * src/c++11/string-inst.cc (time_get::get, time_get::do_get): Add C++11-only instantiations. * testsuite/22_locale/time_get/get/char/1.cc: New. * testsuite/22_locale/time_get/get/char/2.cc: New. * testsuite/22_locale/time_get/get/wchar_t/1.cc: New. * testsuite/22_locale/time_get/get/wchar_t/2.cc: New. Co-Authored-By: Jonathan Wakely <jwakely@redhat.com> From-SVN: r219012
This commit is contained in:
parent
1d3a0146ae
commit
e869c0900c
|
|
@ -1,3 +1,19 @@
|
||||||
|
2014-12-22 Rüdiger Sonderfeld <ruediger@c-plusplus.de>
|
||||||
|
Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
|
PR libstdc++/60396
|
||||||
|
* config/abi/pre/gnu.ver: Add new exports.
|
||||||
|
* include/bits/locale_facets_nonio.h (time_get::get): New overloads.
|
||||||
|
(time_get::do_get): New virtual function.
|
||||||
|
* include/bits/locale_facets_nonio.tcc (time_get::get): Define.
|
||||||
|
(time_get::do_get): Define.
|
||||||
|
* src/c++11/string-inst.cc (time_get::get, time_get::do_get): Add
|
||||||
|
C++11-only instantiations.
|
||||||
|
* testsuite/22_locale/time_get/get/char/1.cc: New.
|
||||||
|
* testsuite/22_locale/time_get/get/char/2.cc: New.
|
||||||
|
* testsuite/22_locale/time_get/get/wchar_t/1.cc: New.
|
||||||
|
* testsuite/22_locale/time_get/get/wchar_t/2.cc: New.
|
||||||
|
|
||||||
2014-12-21 Jonathan Wakely <jwakely@redhat.com>
|
2014-12-21 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
PR libstdc++/64367
|
PR libstdc++/64367
|
||||||
|
|
|
||||||
|
|
@ -1748,6 +1748,10 @@ GLIBCXX_3.4.21 {
|
||||||
|
|
||||||
_ZNKSt3tr14hashINSt7__cxx1112basic_string*;
|
_ZNKSt3tr14hashINSt7__cxx1112basic_string*;
|
||||||
|
|
||||||
|
# std::time_get::get
|
||||||
|
_ZNKSt8time_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPK[cw]SC_;
|
||||||
|
_ZNKSt8time_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmcc;
|
||||||
|
|
||||||
} GLIBCXX_3.4.20;
|
} GLIBCXX_3.4.20;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -537,6 +537,54 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
|
||||||
ios_base::iostate& __err, tm* __tm) const
|
ios_base::iostate& __err, tm* __tm) const
|
||||||
{ return this->do_get_year(__beg, __end, __io, __err, __tm); }
|
{ return this->do_get_year(__beg, __end, __io, __err, __tm); }
|
||||||
|
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
/**
|
||||||
|
* @brief Parse input string according to format.
|
||||||
|
*
|
||||||
|
* This function calls time_get::do_get with the provided
|
||||||
|
* parameters. @see do_get() and get().
|
||||||
|
*
|
||||||
|
* @param __s Start of string to parse.
|
||||||
|
* @param __end End of string to parse.
|
||||||
|
* @param __io Source of the locale.
|
||||||
|
* @param __err Error flags to set.
|
||||||
|
* @param __tm Pointer to struct tm to fill in.
|
||||||
|
* @param __format Format specifier.
|
||||||
|
* @param __modifier Format modifier.
|
||||||
|
* @return Iterator to first char not parsed.
|
||||||
|
*/
|
||||||
|
inline
|
||||||
|
iter_type get(iter_type __s, iter_type __end, ios_base& __io,
|
||||||
|
ios_base::iostate& __err, tm* __tm, char __format,
|
||||||
|
char __modifier = 0) const
|
||||||
|
{
|
||||||
|
return this->do_get(__s, __end, __io, __err, __tm, __format,
|
||||||
|
__modifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Parse input string according to format.
|
||||||
|
*
|
||||||
|
* This function parses the input string according to a
|
||||||
|
* provided format string. It does the inverse of
|
||||||
|
* time_put::put. The format string follows the format
|
||||||
|
* specified for strftime(3)/strptime(3). The actual parsing
|
||||||
|
* is done by time_get::do_get.
|
||||||
|
*
|
||||||
|
* @param __s Start of string to parse.
|
||||||
|
* @param __end End of string to parse.
|
||||||
|
* @param __io Source of the locale.
|
||||||
|
* @param __err Error flags to set.
|
||||||
|
* @param __tm Pointer to struct tm to fill in.
|
||||||
|
* @param __fmt Start of the format string.
|
||||||
|
* @param __fmtend End of the format string.
|
||||||
|
* @return Iterator to first char not parsed.
|
||||||
|
*/
|
||||||
|
iter_type get(iter_type __s, iter_type __end, ios_base& __io,
|
||||||
|
ios_base::iostate& __err, tm* __tm, const char_type* __fmt,
|
||||||
|
const char_type* __fmtend) const;
|
||||||
|
#endif // __cplusplus >= 201103L
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// Destructor.
|
/// Destructor.
|
||||||
virtual
|
virtual
|
||||||
|
|
@ -650,6 +698,33 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
|
||||||
do_get_year(iter_type __beg, iter_type __end, ios_base& __io,
|
do_get_year(iter_type __beg, iter_type __end, ios_base& __io,
|
||||||
ios_base::iostate& __err, tm* __tm) const;
|
ios_base::iostate& __err, tm* __tm) const;
|
||||||
|
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
/**
|
||||||
|
* @brief Parse input string according to format.
|
||||||
|
*
|
||||||
|
* This function parses the string according to the provided
|
||||||
|
* format and optional modifier. This function is a hook for
|
||||||
|
* derived classes to change the value returned. @see get()
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* @param __s Start of string to parse.
|
||||||
|
* @param __end End of string to parse.
|
||||||
|
* @param __io Source of the locale.
|
||||||
|
* @param __err Error flags to set.
|
||||||
|
* @param __tm Pointer to struct tm to fill in.
|
||||||
|
* @param __format Format specifier.
|
||||||
|
* @param __modifier Format modifier.
|
||||||
|
* @return Iterator to first char not parsed.
|
||||||
|
*/
|
||||||
|
#if _GLIBCXX_USE_CXX11_ABI
|
||||||
|
virtual
|
||||||
|
#endif
|
||||||
|
iter_type
|
||||||
|
do_get(iter_type __s, iter_type __end, ios_base& __f,
|
||||||
|
ios_base::iostate& __err, tm* __tm,
|
||||||
|
char __format, char __modifier) const;
|
||||||
|
#endif // __cplusplus >= 201103L
|
||||||
|
|
||||||
// Extract numeric component of length __len.
|
// Extract numeric component of length __len.
|
||||||
iter_type
|
iter_type
|
||||||
_M_extract_num(iter_type __beg, iter_type __end, int& __member,
|
_M_extract_num(iter_type __beg, iter_type __end, int& __member,
|
||||||
|
|
|
||||||
|
|
@ -1141,6 +1141,113 @@ _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11
|
||||||
return __beg;
|
return __beg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
template<typename _CharT, typename _InIter>
|
||||||
|
inline
|
||||||
|
_InIter
|
||||||
|
time_get<_CharT, _InIter>::
|
||||||
|
get(iter_type __s, iter_type __end, ios_base& __io,
|
||||||
|
ios_base::iostate& __err, tm* __tm, const char_type* __fmt,
|
||||||
|
const char_type* __fmtend) const
|
||||||
|
{
|
||||||
|
const locale& __loc = __io._M_getloc();
|
||||||
|
ctype<_CharT> const& __ctype = use_facet<ctype<_CharT> >(__loc);
|
||||||
|
__err = ios_base::goodbit;
|
||||||
|
while (__fmt != __fmtend &&
|
||||||
|
__err == ios_base::goodbit)
|
||||||
|
{
|
||||||
|
if (__s == __end)
|
||||||
|
{
|
||||||
|
__err = ios_base::eofbit | ios_base::failbit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (__ctype.narrow(*__fmt, 0) == '%')
|
||||||
|
{
|
||||||
|
char __format;
|
||||||
|
char __mod = 0;
|
||||||
|
if (++__fmt == __fmtend)
|
||||||
|
{
|
||||||
|
__err = ios_base::failbit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const char __c = __ctype.narrow(*__fmt, 0);
|
||||||
|
if (__c != 'E' && __c != 'O')
|
||||||
|
__format = __c;
|
||||||
|
else if (++__fmt != __fmtend)
|
||||||
|
{
|
||||||
|
__mod = __c;
|
||||||
|
__format = __ctype.narrow(*__fmt, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__err = ios_base::failbit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
__s = this->do_get(__s, __end, __io, __err, __tm, __format,
|
||||||
|
__mod);
|
||||||
|
++__fmt;
|
||||||
|
}
|
||||||
|
else if (__ctype.is(ctype_base::space, *__fmt))
|
||||||
|
{
|
||||||
|
++__fmt;
|
||||||
|
while (__fmt != __fmtend &&
|
||||||
|
__ctype.is(ctype_base::space, *__fmt))
|
||||||
|
++__fmt;
|
||||||
|
|
||||||
|
while (__s != __end &&
|
||||||
|
__ctype.is(ctype_base::space, *__s))
|
||||||
|
++__s;
|
||||||
|
}
|
||||||
|
// TODO real case-insensitive comparison
|
||||||
|
else if (__ctype.tolower(*__s) == __ctype.tolower(*__fmt) ||
|
||||||
|
__ctype.toupper(*__s) == __ctype.toupper(*__fmt))
|
||||||
|
{
|
||||||
|
++__s;
|
||||||
|
++__fmt;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__err = ios_base::failbit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return __s;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename _CharT, typename _InIter>
|
||||||
|
inline
|
||||||
|
_InIter
|
||||||
|
time_get<_CharT, _InIter>::
|
||||||
|
do_get(iter_type __beg, iter_type __end, ios_base& __io,
|
||||||
|
ios_base::iostate& __err, tm* __tm,
|
||||||
|
char __format, char __mod) const
|
||||||
|
{
|
||||||
|
const locale& __loc = __io._M_getloc();
|
||||||
|
ctype<_CharT> const& __ctype = use_facet<ctype<_CharT> >(__loc);
|
||||||
|
__err = ios_base::goodbit;
|
||||||
|
|
||||||
|
char_type __fmt[4];
|
||||||
|
__fmt[0] = __ctype.widen('%');
|
||||||
|
if (!__mod)
|
||||||
|
{
|
||||||
|
__fmt[1] = __format;
|
||||||
|
__fmt[2] = char_type();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__fmt[1] = __mod;
|
||||||
|
__fmt[2] = __format;
|
||||||
|
__fmt[3] = char_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
__beg = _M_extract_via_format(__beg, __end, __io, __err, __tm, __fmt);
|
||||||
|
if (__beg == __end)
|
||||||
|
__err |= ios_base::eofbit;
|
||||||
|
return __beg;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __cplusplus >= 201103L
|
||||||
|
|
||||||
template<typename _CharT, typename _OutIter>
|
template<typename _CharT, typename _OutIter>
|
||||||
_OutIter
|
_OutIter
|
||||||
time_put<_CharT, _OutIter>::
|
time_put<_CharT, _OutIter>::
|
||||||
|
|
|
||||||
|
|
@ -113,3 +113,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
|
|
||||||
_GLIBCXX_END_NAMESPACE_VERSION
|
_GLIBCXX_END_NAMESPACE_VERSION
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
// TODO does not belong here!
|
||||||
|
#include <locale>
|
||||||
|
namespace std _GLIBCXX_VISIBILITY(default)
|
||||||
|
{
|
||||||
|
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
|
_GLIBCXX_BEGIN_NAMESPACE_CXX11
|
||||||
|
template istreambuf_iterator<C> time_get<C, istreambuf_iterator<C> >::get(iter_type, iter_type, ios_base&, ios_base::iostate&, tm*, char, char) const;
|
||||||
|
template istreambuf_iterator<C> time_get<C, istreambuf_iterator<C> >::do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, tm*, char, char) const;
|
||||||
|
template istreambuf_iterator<C> time_get<C, istreambuf_iterator<C> >::get(iter_type, iter_type, ios_base&, ios_base::iostate&, tm*, const char_type*, const char_type*) const;
|
||||||
|
_GLIBCXX_END_NAMESPACE_CXX11
|
||||||
|
_GLIBCXX_END_NAMESPACE_VERSION
|
||||||
|
} // namespace
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,132 @@
|
||||||
|
// { dg-options " -std=gnu++11 " }
|
||||||
|
|
||||||
|
// 2014-04-14 Rüdiger Sonderfeld <ruediger@c-plusplus.de>
|
||||||
|
|
||||||
|
// Copyright (C) 2014 Free Software Foundation, Inc.
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
// terms of the GNU General Public License as published by the
|
||||||
|
// Free Software Foundation; either version 3, or (at your option)
|
||||||
|
// any later version.
|
||||||
|
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this library; see the file COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
// 22.4.5.1.1 (C++11) time_get members [locale.time.get.members]
|
||||||
|
|
||||||
|
#include <locale>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iterator>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
|
#ifndef _GLIBCXX_ASSERT
|
||||||
|
# include <iostream>
|
||||||
|
# define PRINT(x) cout << #x << ": " << x << endl
|
||||||
|
# define TESTHEAD(x) cout << x << endl
|
||||||
|
#else
|
||||||
|
# define PRINT(x) do {} while(false)
|
||||||
|
# define TESTHEAD(x) do {} while(false)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void test01()
|
||||||
|
{
|
||||||
|
using namespace std;
|
||||||
|
bool test __attribute__((unused)) = true;
|
||||||
|
|
||||||
|
locale loc_c = locale::classic();
|
||||||
|
|
||||||
|
istringstream iss;
|
||||||
|
iss.imbue(loc_c);
|
||||||
|
const time_get<char>& tget = use_facet<time_get<char>>(iss.getloc());
|
||||||
|
typedef istreambuf_iterator<char> iter;
|
||||||
|
const iter end;
|
||||||
|
|
||||||
|
tm time;
|
||||||
|
ios_base::iostate err = ios_base::badbit;
|
||||||
|
|
||||||
|
// check regular operations with format string
|
||||||
|
TESTHEAD("regular operations");
|
||||||
|
iss.str("d 2014-04-14 01:09:35");
|
||||||
|
string format = "d %Y-%m-%d %H:%M:%S";
|
||||||
|
auto ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
PRINT(err);
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
VERIFY(ret == end);
|
||||||
|
PRINT(time.tm_year);
|
||||||
|
VERIFY(time.tm_year == 114);
|
||||||
|
PRINT(time.tm_mon);
|
||||||
|
VERIFY(time.tm_mon == 3);
|
||||||
|
PRINT(time.tm_mday);
|
||||||
|
VERIFY(time.tm_mday == 14);
|
||||||
|
PRINT(time.tm_hour);
|
||||||
|
VERIFY(time.tm_hour == 1);
|
||||||
|
PRINT(time.tm_min);
|
||||||
|
VERIFY(time.tm_min == 9);
|
||||||
|
PRINT(time.tm_sec);
|
||||||
|
VERIFY(time.tm_sec == 35);
|
||||||
|
|
||||||
|
TESTHEAD("check eof");
|
||||||
|
iss.str("2020 ");
|
||||||
|
format = "%Y";
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
VERIFY(err != ios_base::eofbit);
|
||||||
|
VERIFY(time.tm_year == 120);
|
||||||
|
VERIFY(ret != end);
|
||||||
|
|
||||||
|
TESTHEAD("check broken format");
|
||||||
|
iss.str("2014-04-14 01:09:35");
|
||||||
|
format = "%";
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
VERIFY(err == ios_base::failbit);
|
||||||
|
|
||||||
|
TESTHEAD("check single format letter version");
|
||||||
|
iss.str("2020");
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time, 'Y');
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
VERIFY(time.tm_year == 120);
|
||||||
|
VERIFY(ret == end);
|
||||||
|
|
||||||
|
TESTHEAD("check skipping of space");
|
||||||
|
iss.str("2010 07 01");
|
||||||
|
format = "%Y %m %d";
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
VERIFY(time.tm_year == 110);
|
||||||
|
VERIFY(time.tm_mon == 6);
|
||||||
|
VERIFY(time.tm_mday == 1);
|
||||||
|
VERIFY(ret == end);
|
||||||
|
|
||||||
|
TESTHEAD("check mismatch");
|
||||||
|
iss.str("year: 1970");
|
||||||
|
format = "jahr: %Y";
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
VERIFY(err == ios_base::failbit);
|
||||||
|
VERIFY(ret == iter(iss));
|
||||||
|
|
||||||
|
TESTHEAD("check case insensitive match");
|
||||||
|
iss.str("yEaR: 1980");
|
||||||
|
format = "YeAR: %Y";
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
VERIFY(ret == end);
|
||||||
|
VERIFY(time.tm_year == 80);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test01();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,104 @@
|
||||||
|
// { dg-require-namedlocale "de_DE.utf8" }
|
||||||
|
// { dg-options " -std=gnu++11 " }
|
||||||
|
|
||||||
|
// 2014-04-14 Rüdiger Sonderfeld <ruediger@c-plusplus.de>
|
||||||
|
|
||||||
|
// Copyright (C) 2014 Free Software Foundation, Inc.
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
// terms of the GNU General Public License as published by the
|
||||||
|
// Free Software Foundation; either version 3, or (at your option)
|
||||||
|
// any later version.
|
||||||
|
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this library; see the file COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
// 22.4.5.1.1 (C++11) time_get members [locale.time.get.members]
|
||||||
|
|
||||||
|
#include <locale>
|
||||||
|
#include <sstream>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
|
#ifndef _GLIBCXX_ASSERT
|
||||||
|
# include <iostream>
|
||||||
|
# define PRINT(x) cout << #x << ": " << x << endl
|
||||||
|
# define TESTHEAD(x) cout << x << endl
|
||||||
|
#else
|
||||||
|
# define PRINT(x) do {} while(false)
|
||||||
|
# define TESTHEAD(x) do {} while(false)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void test02()
|
||||||
|
{
|
||||||
|
using namespace std;
|
||||||
|
bool test __attribute__((unused)) = true;
|
||||||
|
|
||||||
|
locale loc_c = locale::classic();
|
||||||
|
locale loc_de = locale("de_DE.utf8");
|
||||||
|
VERIFY( loc_de != loc_c );
|
||||||
|
|
||||||
|
istringstream iss;
|
||||||
|
iss.imbue(loc_de);
|
||||||
|
const time_get<char>& tget = use_facet<time_get<char>>(iss.getloc());
|
||||||
|
typedef istreambuf_iterator<char> iter;
|
||||||
|
const iter end;
|
||||||
|
|
||||||
|
ios_base::iostate err;
|
||||||
|
tm time;
|
||||||
|
|
||||||
|
TESTHEAD("German locale test");
|
||||||
|
iss.str("Montag, den 14. April 2014");
|
||||||
|
string format = "%A, den %d. %B %Y";
|
||||||
|
auto ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
PRINT(err);
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
PRINT(time.tm_year);
|
||||||
|
VERIFY(time.tm_year == 114);
|
||||||
|
PRINT(time.tm_mon);
|
||||||
|
VERIFY(time.tm_mon == 3);
|
||||||
|
PRINT(time.tm_wday);
|
||||||
|
VERIFY(time.tm_wday == 1);
|
||||||
|
PRINT(time.tm_mday);
|
||||||
|
VERIFY(time.tm_mday == 14);
|
||||||
|
VERIFY(end == end);
|
||||||
|
|
||||||
|
TESTHEAD("German locale: Check case-insensitivity");
|
||||||
|
tm time2;
|
||||||
|
iss.str("Montag, den 14. April 2014");
|
||||||
|
format = "%A, DEN %d. %B %Y"; // check case-insensitivity
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time2,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
PRINT(err);
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
PRINT(time2.tm_year);
|
||||||
|
VERIFY(time2.tm_year == 114);
|
||||||
|
PRINT(time2.tm_mon);
|
||||||
|
VERIFY(time2.tm_mon == 3);
|
||||||
|
PRINT(time2.tm_wday);
|
||||||
|
VERIFY(time2.tm_wday == 1);
|
||||||
|
PRINT(time2.tm_mday);
|
||||||
|
VERIFY(time2.tm_mday == 14);
|
||||||
|
VERIFY(end == end);
|
||||||
|
|
||||||
|
TESTHEAD("German locale: Check single");
|
||||||
|
iss.str("Mittwoch");
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time, 'A');
|
||||||
|
PRINT(err);
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
PRINT(time.tm_wday);
|
||||||
|
VERIFY(time.tm_wday == 3);
|
||||||
|
VERIFY(end == end);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test02();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,132 @@
|
||||||
|
// { dg-options " -std=gnu++11 " }
|
||||||
|
|
||||||
|
// 2014-04-14 Rüdiger Sonderfeld <ruediger@c-plusplus.de>
|
||||||
|
|
||||||
|
// Copyright (C) 2014 Free Software Foundation, Inc.
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
// terms of the GNU General Public License as published by the
|
||||||
|
// Free Software Foundation; either version 3, or (at your option)
|
||||||
|
// any later version.
|
||||||
|
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this library; see the file COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
// 22.4.5.1.1 (C++11) time_get members [locale.time.get.members]
|
||||||
|
|
||||||
|
#include <locale>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iterator>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
|
#ifndef _GLIBCXX_ASSERT
|
||||||
|
# include <iostream>
|
||||||
|
# define PRINT(x) cout << #x << ": " << x << endl
|
||||||
|
# define TESTHEAD(x) cout << x << endl
|
||||||
|
#else
|
||||||
|
# define PRINT(x) do {} while(false)
|
||||||
|
# define TESTHEAD(x) do {} while(false)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void test01()
|
||||||
|
{
|
||||||
|
using namespace std;
|
||||||
|
bool test __attribute__((unused)) = true;
|
||||||
|
|
||||||
|
locale loc_c = locale::classic();
|
||||||
|
|
||||||
|
wistringstream iss;
|
||||||
|
iss.imbue(loc_c);
|
||||||
|
const time_get<wchar_t>& tget = use_facet<time_get<wchar_t>>(iss.getloc());
|
||||||
|
typedef istreambuf_iterator<wchar_t> iter;
|
||||||
|
const iter end;
|
||||||
|
|
||||||
|
tm time;
|
||||||
|
ios_base::iostate err = ios_base::badbit;
|
||||||
|
|
||||||
|
// check regular operations with format string
|
||||||
|
TESTHEAD("regular operations");
|
||||||
|
iss.str(L"d 2014-04-14 01:09:35");
|
||||||
|
wstring format = L"d %Y-%m-%d %H:%M:%S";
|
||||||
|
auto ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
PRINT(err);
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
VERIFY(ret == end);
|
||||||
|
PRINT(time.tm_year);
|
||||||
|
VERIFY(time.tm_year == 114);
|
||||||
|
PRINT(time.tm_mon);
|
||||||
|
VERIFY(time.tm_mon == 3);
|
||||||
|
PRINT(time.tm_mday);
|
||||||
|
VERIFY(time.tm_mday == 14);
|
||||||
|
PRINT(time.tm_hour);
|
||||||
|
VERIFY(time.tm_hour == 1);
|
||||||
|
PRINT(time.tm_min);
|
||||||
|
VERIFY(time.tm_min == 9);
|
||||||
|
PRINT(time.tm_sec);
|
||||||
|
VERIFY(time.tm_sec == 35);
|
||||||
|
|
||||||
|
TESTHEAD("check eof");
|
||||||
|
iss.str(L"2020 ");
|
||||||
|
format = L"%Y";
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
VERIFY(err != ios_base::eofbit);
|
||||||
|
VERIFY(time.tm_year == 120);
|
||||||
|
VERIFY(ret != end);
|
||||||
|
|
||||||
|
TESTHEAD("check broken format");
|
||||||
|
iss.str(L"2014-04-14 01:09:35");
|
||||||
|
format = L"%";
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
VERIFY(err == ios_base::failbit);
|
||||||
|
|
||||||
|
TESTHEAD("check single format letter version");
|
||||||
|
iss.str(L"2020");
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time, L'Y');
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
VERIFY(time.tm_year == 120);
|
||||||
|
VERIFY(ret == end);
|
||||||
|
|
||||||
|
TESTHEAD(L"check skipping of space");
|
||||||
|
iss.str(L"2010 07 01");
|
||||||
|
format = L"%Y %m %d";
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
VERIFY(time.tm_year == 110);
|
||||||
|
VERIFY(time.tm_mon == 6);
|
||||||
|
VERIFY(time.tm_mday == 1);
|
||||||
|
VERIFY(ret == end);
|
||||||
|
|
||||||
|
TESTHEAD("check mismatch");
|
||||||
|
iss.str(L"year: 1970");
|
||||||
|
format = L"jahr: %Y";
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
VERIFY(err == ios_base::failbit);
|
||||||
|
VERIFY(ret == iter(iss));
|
||||||
|
|
||||||
|
TESTHEAD("check case insensitive match");
|
||||||
|
iss.str(L"yEaR: 1980");
|
||||||
|
format = L"YeAR: %Y";
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
VERIFY(ret == end);
|
||||||
|
VERIFY(time.tm_year == 80);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test01();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,104 @@
|
||||||
|
// { dg-require-namedlocale "de_DE.utf8" }
|
||||||
|
// { dg-options " -std=gnu++11 " }
|
||||||
|
|
||||||
|
// 2014-04-14 Rüdiger Sonderfeld <ruediger@c-plusplus.de>
|
||||||
|
|
||||||
|
// Copyright (C) 2014 Free Software Foundation, Inc.
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
// terms of the GNU General Public License as published by the
|
||||||
|
// Free Software Foundation; either version 3, or (at your option)
|
||||||
|
// any later version.
|
||||||
|
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this library; see the file COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
// 22.4.5.1.1 (C++11) time_get members [locale.time.get.members]
|
||||||
|
|
||||||
|
#include <locale>
|
||||||
|
#include <sstream>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
|
#ifndef _GLIBCXX_ASSERT
|
||||||
|
# include <iostream>
|
||||||
|
# define PRINT(x) cout << #x << ": " << x << endl
|
||||||
|
# define TESTHEAD(x) cout << x << endl
|
||||||
|
#else
|
||||||
|
# define PRINT(x) do {} while(false)
|
||||||
|
# define TESTHEAD(x) do {} while(false)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void test02()
|
||||||
|
{
|
||||||
|
using namespace std;
|
||||||
|
bool test __attribute__((unused)) = true;
|
||||||
|
|
||||||
|
locale loc_c = locale::classic();
|
||||||
|
locale loc_de = locale("de_DE.utf8");
|
||||||
|
VERIFY( loc_de != loc_c );
|
||||||
|
|
||||||
|
wistringstream iss;
|
||||||
|
iss.imbue(loc_de);
|
||||||
|
const time_get<wchar_t>& tget = use_facet<time_get<wchar_t>>(iss.getloc());
|
||||||
|
typedef istreambuf_iterator<wchar_t> iter;
|
||||||
|
const iter end;
|
||||||
|
|
||||||
|
ios_base::iostate err;
|
||||||
|
tm time;
|
||||||
|
|
||||||
|
TESTHEAD("German locale test");
|
||||||
|
iss.str(L"Montag, den 14. April 2014");
|
||||||
|
wstring format = L"%A, den %d. %B %Y";
|
||||||
|
auto ret = tget.get(iter(iss), end, iss, err, &time,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
PRINT(err);
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
PRINT(time.tm_year);
|
||||||
|
VERIFY(time.tm_year == 114);
|
||||||
|
PRINT(time.tm_mon);
|
||||||
|
VERIFY(time.tm_mon == 3);
|
||||||
|
PRINT(time.tm_wday);
|
||||||
|
VERIFY(time.tm_wday == 1);
|
||||||
|
PRINT(time.tm_mday);
|
||||||
|
VERIFY(time.tm_mday == 14);
|
||||||
|
VERIFY(end == end);
|
||||||
|
|
||||||
|
TESTHEAD("German locale: Check case-insensitivity");
|
||||||
|
tm time2;
|
||||||
|
iss.str(L"Montag, den 14. April 2014");
|
||||||
|
format = L"%A, DEN %d. %B %Y"; // check case-insensitivity
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time2,
|
||||||
|
format.data(), format.data()+format.size());
|
||||||
|
PRINT(err);
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
PRINT(time2.tm_year);
|
||||||
|
VERIFY(time2.tm_year == 114);
|
||||||
|
PRINT(time2.tm_mon);
|
||||||
|
VERIFY(time2.tm_mon == 3);
|
||||||
|
PRINT(time2.tm_wday);
|
||||||
|
VERIFY(time2.tm_wday == 1);
|
||||||
|
PRINT(time2.tm_mday);
|
||||||
|
VERIFY(time2.tm_mday == 14);
|
||||||
|
VERIFY(end == end);
|
||||||
|
|
||||||
|
TESTHEAD("German locale: Check single");
|
||||||
|
iss.str(L"Mittwoch");
|
||||||
|
ret = tget.get(iter(iss), end, iss, err, &time, L'A');
|
||||||
|
PRINT(err);
|
||||||
|
VERIFY(err == ios_base::eofbit);
|
||||||
|
PRINT(time.tm_wday);
|
||||||
|
VERIFY(time.tm_wday == 3);
|
||||||
|
VERIFY(end == end);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test02();
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue