This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFC] In do_get_time, %S from 0 to 59, or 60, or even 61?!?


Paolo Carlini wrote:

Yes, seems the best thing to do: _GLIBCXX_USE_C99 is defined on
C99 platforms and we can use it for chosing 60 or 61. The corresponding
autoconf tests are rather strict but the worst that can happen is that we
accept 61 too. Seems a good approximation, for now.

The below is what I'm finishing regtesting and will be committing tomorrow, if everything goes well, barring objections, of course...

Thanks,
Paolo.

////////////////
2004-09-29  Paolo Carlini  <pcarlini@suse.de>

	* include/bits/locale_facets.tcc (time_get<>::_M_extract_via_format,
	case 'S'): Allow for at least one leap-second (as per C99, 7.23.1
	and 7.23.3.5), two if !_GLIBCXX_USE_C99.
	* testsuite/22_locale/time_get/get_time/char/4.cc: New.
	* testsuite/22_locale/time_get/get_time/wchar_t/4.cc: Likewise.
diff -urN libstdc++-v3-orig/include/bits/locale_facets.tcc libstdc++-v3/include/bits/locale_facets.tcc
--- libstdc++-v3-orig/include/bits/locale_facets.tcc	2004-08-25 21:52:11.000000000 +0200
+++ libstdc++-v3/include/bits/locale_facets.tcc	2004-08-29 00:04:58.000000000 +0200
@@ -1849,8 +1849,13 @@
 						__tm, __wcs);
 		  break;
 		case 'S':
-		  // Seconds.
-		  __beg = _M_extract_num(__beg, __end, __tm->tm_sec, 0, 59, 2,
+		  // Seconds. [tm_sec]
+		  // [00, 60] in C99 (one leap-second), [00, 61] in C89.
+#ifdef _GLIBCXX_USE_C99
+		  __beg = _M_extract_num(__beg, __end, __tm->tm_sec, 0, 60, 2,
+#else
+		  __beg = _M_extract_num(__beg, __end, __tm->tm_sec, 0, 61, 2,
+#endif
 					 __io, __err);
 		  break;
 		case 't':
diff -urN libstdc++-v3-orig/testsuite/22_locale/time_get/get_time/char/4.cc libstdc++-v3/testsuite/22_locale/time_get/get_time/char/4.cc
--- libstdc++-v3-orig/testsuite/22_locale/time_get/get_time/char/4.cc	1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/22_locale/time_get/get_time/char/4.cc	2004-08-29 00:25:17.000000000 +0200
@@ -0,0 +1,64 @@
+// 2004-08-29  Paolo Carlini  <pcarlini@suse.de>
+
+// Copyright (C) 2004 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 22.2.5.1.1 time_get members
+
+#include <locale>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+// Allow for one leap-second (two if !_GLIBCXX_USE_C99).
+void test01()
+{
+  using namespace std;
+  bool test __attribute__((unused)) = true;
+
+  typedef istreambuf_iterator<char> iterator_type;
+
+  // basic construction and sanity checks.
+  locale loc_c = locale::classic();
+
+  // create an istream-derived object, cache the time_get facet
+  iterator_type end;
+  istringstream iss;
+  iss.imbue(loc_c);
+  const time_get<char>& tim_get =
+    use_facet<time_get<char> >(iss.getloc()); 
+
+  const ios_base::iostate good = ios_base::goodbit;
+  ios_base::iostate errorstate = good;
+
+  // create "C" time objects
+  const tm time_bday = { 60, 0, 12, 4, 3, 71, 0, 93, 0 };
+
+  iss.str("12:00:60 ");
+  iterator_type is_it01(iss);
+  tm time01;
+  errorstate = good;
+  tim_get.get_time(is_it01, end, iss, errorstate, &time01);
+  VERIFY( time01.tm_sec == time_bday.tm_sec );
+  VERIFY( errorstate == ios_base::goodbit );
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
diff -urN libstdc++-v3-orig/testsuite/22_locale/time_get/get_time/wchar_t/4.cc libstdc++-v3/testsuite/22_locale/time_get/get_time/wchar_t/4.cc
--- libstdc++-v3-orig/testsuite/22_locale/time_get/get_time/wchar_t/4.cc	1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/22_locale/time_get/get_time/wchar_t/4.cc	2004-08-29 00:26:03.000000000 +0200
@@ -0,0 +1,64 @@
+// 2004-08-29  Paolo Carlini  <pcarlini@suse.de>
+
+// Copyright (C) 2004 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 22.2.5.1.1 time_get members
+
+#include <locale>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+// Allow for one leap-second (two if !_GLIBCXX_USE_C99).
+void test01()
+{
+  using namespace std;
+  bool test __attribute__((unused)) = true;
+
+  typedef istreambuf_iterator<wchar_t> iterator_type;
+
+  // basic construction and sanity checks.
+  locale loc_c = locale::classic();
+
+  // create an istream-derived object, cache the time_get facet
+  iterator_type end;
+  wistringstream iss;
+  iss.imbue(loc_c);
+  const time_get<wchar_t>& tim_get =
+    use_facet<time_get<wchar_t> >(iss.getloc()); 
+
+  const ios_base::iostate good = ios_base::goodbit;
+  ios_base::iostate errorstate = good;
+
+  // create "C" time objects
+  const tm time_bday = { 60, 0, 12, 4, 3, 71, 0, 93, 0 };
+
+  iss.str(L"12:00:60 ");
+  iterator_type is_it01(iss);
+  tm time01;
+  errorstate = good;
+  tim_get.get_time(is_it01, end, iss, errorstate, &time01);
+  VERIFY( time01.tm_sec == time_bday.tm_sec );
+  VERIFY( errorstate == ios_base::goodbit );
+}
+
+int main()
+{
+  test01();
+  return 0;
+}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]