1*f8a1b7d9SAlexander Kabaev // Copyright (C) 2000, 2002, 2004, 2005 Free Software Foundation, Inc.
200db7afdSDavid E. O'Brien //
300db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library.  This library is free
400db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
500db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
600db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
700db7afdSDavid E. O'Brien // any later version.
800db7afdSDavid E. O'Brien 
900db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1000db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1100db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1200db7afdSDavid E. O'Brien // GNU General Public License for more details.
1300db7afdSDavid E. O'Brien 
1400db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1500db7afdSDavid E. O'Brien // with this library; see the file COPYING.  If not, write to the Free
16*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
1700db7afdSDavid E. O'Brien // USA.
1800db7afdSDavid E. O'Brien 
1900db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2000db7afdSDavid E. O'Brien // library without restriction.  Specifically, if other files instantiate
2100db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2200db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2300db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2400db7afdSDavid E. O'Brien // the GNU General Public License.  This exception does not however
2500db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
2600db7afdSDavid E. O'Brien // the GNU General Public License.
2700db7afdSDavid E. O'Brien 
28*f8a1b7d9SAlexander Kabaev // Written by Benjamin Kosnik <[email protected]>
2900db7afdSDavid E. O'Brien 
3000db7afdSDavid E. O'Brien #include <locale>
3100db7afdSDavid E. O'Brien 
32*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
33*f8a1b7d9SAlexander Kabaev 
3420250742SAlexander Kabaev   // Definitions for locale::id of standard facets that are specialized.
3520250742SAlexander Kabaev  locale::id codecvt<char, char, mbstate_t>::id;
3620250742SAlexander Kabaev 
37ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T
3820250742SAlexander Kabaev   locale::id codecvt<wchar_t, char, mbstate_t>::id;
3920250742SAlexander Kabaev #endif
4020250742SAlexander Kabaev 
4100db7afdSDavid E. O'Brien   codecvt<char, char, mbstate_t>::
codecvt(size_t __refs)4200db7afdSDavid E. O'Brien   codecvt(size_t __refs)
43ffeaf689SAlexander Kabaev   : __codecvt_abstract_base<char, char, mbstate_t>(__refs),
44ffeaf689SAlexander Kabaev   _M_c_locale_codecvt(_S_get_c_locale())
45ffeaf689SAlexander Kabaev   { }
46ffeaf689SAlexander Kabaev 
47ffeaf689SAlexander Kabaev   codecvt<char, char, mbstate_t>::
codecvt(__c_locale __cloc,size_t __refs)48ffeaf689SAlexander Kabaev   codecvt(__c_locale __cloc, size_t __refs)
49ffeaf689SAlexander Kabaev   : __codecvt_abstract_base<char, char, mbstate_t>(__refs),
50ffeaf689SAlexander Kabaev   _M_c_locale_codecvt(_S_clone_c_locale(__cloc))
5100db7afdSDavid E. O'Brien   { }
5200db7afdSDavid E. O'Brien 
5300db7afdSDavid E. O'Brien   codecvt<char, char, mbstate_t>::
~codecvt()5420250742SAlexander Kabaev   ~codecvt()
55ffeaf689SAlexander Kabaev   { _S_destroy_c_locale(_M_c_locale_codecvt); }
5600db7afdSDavid E. O'Brien 
5700db7afdSDavid E. O'Brien   codecvt_base::result
5800db7afdSDavid E. O'Brien   codecvt<char, char, mbstate_t>::
do_out(state_type &,const intern_type * __from,const intern_type *,const intern_type * & __from_next,extern_type * __to,extern_type *,extern_type * & __to_next) const5900db7afdSDavid E. O'Brien   do_out(state_type&, const intern_type* __from,
6061e268fbSAlexander Kabaev 	 const intern_type*, const intern_type*& __from_next,
6161e268fbSAlexander Kabaev 	 extern_type* __to, extern_type*,
6200db7afdSDavid E. O'Brien 	 extern_type*& __to_next) const
6300db7afdSDavid E. O'Brien   {
64ffeaf689SAlexander Kabaev     // _GLIBCXX_RESOLVE_LIB_DEFECTS
6561e268fbSAlexander Kabaev     // According to the resolution of DR19, "If returns noconv [...]
6661e268fbSAlexander Kabaev     // there are no changes to the values in [to, to_limit)."
6700db7afdSDavid E. O'Brien     __from_next = __from;
6800db7afdSDavid E. O'Brien     __to_next = __to;
6900db7afdSDavid E. O'Brien     return noconv;
7000db7afdSDavid E. O'Brien   }
7100db7afdSDavid E. O'Brien 
7200db7afdSDavid E. O'Brien   codecvt_base::result
7300db7afdSDavid E. O'Brien   codecvt<char, char, mbstate_t>::
do_unshift(state_type &,extern_type * __to,extern_type *,extern_type * & __to_next) const7400db7afdSDavid E. O'Brien   do_unshift(state_type&, extern_type* __to,
7500db7afdSDavid E. O'Brien              extern_type*, extern_type*& __to_next) const
7600db7afdSDavid E. O'Brien   {
7700db7afdSDavid E. O'Brien     __to_next = __to;
7800db7afdSDavid E. O'Brien     return noconv;
7900db7afdSDavid E. O'Brien   }
8000db7afdSDavid E. O'Brien 
8100db7afdSDavid E. O'Brien   codecvt_base::result
8200db7afdSDavid E. O'Brien   codecvt<char, char, mbstate_t>::
do_in(state_type &,const extern_type * __from,const extern_type *,const extern_type * & __from_next,intern_type * __to,intern_type *,intern_type * & __to_next) const8300db7afdSDavid E. O'Brien   do_in(state_type&, const extern_type* __from,
8461e268fbSAlexander Kabaev 	const extern_type*, const extern_type*& __from_next,
85ffeaf689SAlexander Kabaev 	intern_type* __to, intern_type*, intern_type*& __to_next) const
8600db7afdSDavid E. O'Brien   {
87ffeaf689SAlexander Kabaev     // _GLIBCXX_RESOLVE_LIB_DEFECTS
8861e268fbSAlexander Kabaev     // According to the resolution of DR19, "If returns noconv [...]
8961e268fbSAlexander Kabaev     // there are no changes to the values in [to, to_limit)."
9000db7afdSDavid E. O'Brien     __from_next = __from;
9100db7afdSDavid E. O'Brien     __to_next = __to;
9200db7afdSDavid E. O'Brien     return noconv;
9300db7afdSDavid E. O'Brien   }
9400db7afdSDavid E. O'Brien 
9500db7afdSDavid E. O'Brien   int
9600db7afdSDavid E. O'Brien   codecvt<char, char, mbstate_t>::
do_encoding() const9700db7afdSDavid E. O'Brien   do_encoding() const throw()
9800db7afdSDavid E. O'Brien   { return 1; }
9900db7afdSDavid E. O'Brien 
10000db7afdSDavid E. O'Brien   bool
10100db7afdSDavid E. O'Brien   codecvt<char, char, mbstate_t>::
do_always_noconv() const10200db7afdSDavid E. O'Brien   do_always_noconv() const throw()
10300db7afdSDavid E. O'Brien   { return true; }
10400db7afdSDavid E. O'Brien 
10500db7afdSDavid E. O'Brien   int
10600db7afdSDavid E. O'Brien   codecvt<char, char, mbstate_t>::
do_length(state_type &,const extern_type * __from,const extern_type * __end,size_t __max) const107ffeaf689SAlexander Kabaev   do_length (state_type&, const extern_type* __from,
10800db7afdSDavid E. O'Brien 	     const extern_type* __end, size_t __max) const
109ffeaf689SAlexander Kabaev   {
110ffeaf689SAlexander Kabaev     size_t __d = static_cast<size_t>(__end - __from);
111ffeaf689SAlexander Kabaev     return std::min(__max, __d);
112ffeaf689SAlexander Kabaev   }
11300db7afdSDavid E. O'Brien 
11400db7afdSDavid E. O'Brien   int
11500db7afdSDavid E. O'Brien   codecvt<char, char, mbstate_t>::
do_max_length() const11600db7afdSDavid E. O'Brien   do_max_length() const throw()
11700db7afdSDavid E. O'Brien   { return 1; }
11800db7afdSDavid E. O'Brien 
119ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T
12000db7afdSDavid E. O'Brien   // codecvt<wchar_t, char, mbstate_t> required specialization
12100db7afdSDavid E. O'Brien   codecvt<wchar_t, char, mbstate_t>::
codecvt(size_t __refs)12200db7afdSDavid E. O'Brien   codecvt(size_t __refs)
123ffeaf689SAlexander Kabaev   : __codecvt_abstract_base<wchar_t, char, mbstate_t>(__refs),
124ffeaf689SAlexander Kabaev   _M_c_locale_codecvt(_S_get_c_locale())
125ffeaf689SAlexander Kabaev   { }
126ffeaf689SAlexander Kabaev 
127ffeaf689SAlexander Kabaev   codecvt<wchar_t, char, mbstate_t>::
codecvt(__c_locale __cloc,size_t __refs)128ffeaf689SAlexander Kabaev   codecvt(__c_locale __cloc, size_t __refs)
129ffeaf689SAlexander Kabaev   : __codecvt_abstract_base<wchar_t, char, mbstate_t>(__refs),
130ffeaf689SAlexander Kabaev   _M_c_locale_codecvt(_S_clone_c_locale(__cloc))
13120250742SAlexander Kabaev   { }
13200db7afdSDavid E. O'Brien 
13300db7afdSDavid E. O'Brien   codecvt<wchar_t, char, mbstate_t>::
~codecvt()13420250742SAlexander Kabaev   ~codecvt()
135ffeaf689SAlexander Kabaev   { _S_destroy_c_locale(_M_c_locale_codecvt); }
13600db7afdSDavid E. O'Brien 
13700db7afdSDavid E. O'Brien   codecvt_base::result
13800db7afdSDavid E. O'Brien   codecvt<wchar_t, char, mbstate_t>::
do_unshift(state_type &,extern_type * __to,extern_type *,extern_type * & __to_next) const13900db7afdSDavid E. O'Brien   do_unshift(state_type&, extern_type* __to,
14000db7afdSDavid E. O'Brien 	     extern_type*, extern_type*& __to_next) const
14100db7afdSDavid E. O'Brien   {
142ffeaf689SAlexander Kabaev     // XXX Probably wrong for stateful encodings
14300db7afdSDavid E. O'Brien     __to_next = __to;
14400db7afdSDavid E. O'Brien     return noconv;
14500db7afdSDavid E. O'Brien   }
14600db7afdSDavid E. O'Brien 
14700db7afdSDavid E. O'Brien   bool
14800db7afdSDavid E. O'Brien   codecvt<wchar_t, char, mbstate_t>::
do_always_noconv() const14900db7afdSDavid E. O'Brien   do_always_noconv() const throw()
15000db7afdSDavid E. O'Brien   { return false; }
151ffeaf689SAlexander Kabaev #endif //  _GLIBCXX_USE_WCHAR_T
152*f8a1b7d9SAlexander Kabaev 
153*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
154