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