1// std::time_get, std::time_put implementation, generic version -*- C++ -*-
2
3// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4// 2009, 2010
5// Free Software Foundation, Inc.
6//
7// This file is part of the GNU ISO C++ Library.  This library is free
8// software; you can redistribute it and/or modify it under the
9// terms of the GNU General Public License as published by the
10// Free Software Foundation; either version 3, or (at your option)
11// any later version.
12
13// This library is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16// GNU General Public License for more details.
17
18// Under Section 7 of GPL version 3, you are granted additional
19// permissions described in the GCC Runtime Library Exception, version
20// 3.1, as published by the Free Software Foundation.
21
22// You should have received a copy of the GNU General Public License and
23// a copy of the GCC Runtime Library Exception along with this program;
24// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
25// <http://www.gnu.org/licenses/>.
26
27/** @file bits/time_members.h
28 *  This is an internal header file, included by other library headers.
29 *  Do not attempt to use it directly. @headername{locale}
30 */
31
32//
33// ISO C++ 14882: 22.2.5.1.2 - time_get functions
34// ISO C++ 14882: 22.2.5.3.2 - time_put functions
35//
36
37// Written by Benjamin Kosnik <bkoz@redhat.com>
38
39namespace std _GLIBCXX_VISIBILITY(default)
40{
41_GLIBCXX_BEGIN_NAMESPACE_VERSION
42
43  template<typename _CharT>
44    __timepunct<_CharT>::__timepunct(size_t __refs)
45    : facet(__refs), _M_data(0)
46    {
47      _M_name_timepunct = _S_get_c_name();
48      _M_initialize_timepunct();
49    }
50
51  template<typename _CharT>
52    __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs)
53    : facet(__refs), _M_data(__cache)
54    {
55      _M_name_timepunct = _S_get_c_name();
56      _M_initialize_timepunct();
57    }
58
59  template<typename _CharT>
60    __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s,
61				     size_t __refs)
62    : facet(__refs), _M_data(0)
63    {
64      if (__builtin_strcmp(__s, _S_get_c_name()) != 0)
65	{
66	  const size_t __len = __builtin_strlen(__s) + 1;
67	  char* __tmp = new char[__len];
68	  __builtin_memcpy(__tmp, __s, __len);
69	  _M_name_timepunct = __tmp;
70	}
71      else
72	_M_name_timepunct = _S_get_c_name();
73
74      __try
75	{ _M_initialize_timepunct(__cloc); }
76      __catch(...)
77	{
78	  if (_M_name_timepunct != _S_get_c_name())
79	    delete [] _M_name_timepunct;
80	  __throw_exception_again;
81	}
82    }
83
84  template<typename _CharT>
85    __timepunct<_CharT>::~__timepunct()
86    {
87      if (_M_name_timepunct != _S_get_c_name())
88	delete [] _M_name_timepunct;
89      delete _M_data;
90      _S_destroy_c_locale(_M_c_locale_timepunct);
91    }
92
93_GLIBCXX_END_NAMESPACE_VERSION
94} // namespace
95