Copyright (C) 2000-2012 |
Whole document tree codecvt.hGo to the documentation of this file.00001 // Locale support (codecvt) -*- C++ -*- 00002 00003 // Copyright (C) 2000, 2001 Free Software Foundation, Inc. 00004 // 00005 // This file is part of the GNU ISO C++ Library. This library is free 00006 // software; you can redistribute it and/or modify it under the 00007 // terms of the GNU General Public License as published by the 00008 // Free Software Foundation; either version 2, or (at your option) 00009 // any later version. 00010 00011 // This library is distributed in the hope that it will be useful, 00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 // GNU General Public License for more details. 00015 00016 // You should have received a copy of the GNU General Public License along 00017 // with this library; see the file COPYING. If not, write to the Free 00018 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 00019 // USA. 00020 00021 // As a special exception, you may use this file as part of a free software 00022 // library without restriction. Specifically, if other files instantiate 00023 // templates or use macros or inline functions from this file, or you compile 00024 // this file and link it with other files to produce an executable, this 00025 // file does not by itself cause the resulting executable to be covered by 00026 // the GNU General Public License. This exception does not however 00027 // invalidate any other reasons why the executable file might be covered by 00028 // the GNU General Public License. 00029 00030 // 00031 // ISO C++ 14882: 22.2.1.5 Template class codecvt 00032 // 00033 00034 // Warning: this file is not meant for user inclusion. Use <locale>. 00035 00036 // Written by Benjamin Kosnik <bkoz@cygnus.com> 00037 00038 #ifndef _CPP_BITS_CODECVT_H 00039 #define _CPP_BITS_CODECVT_H 1 00040 00041 #pragma GCC system_header 00042 00043 // XXX 00044 // __enc_traits may need to move up the locale header hierarchy, 00045 // depending on if ctype ends up using it. 00046 00047 #ifdef _GLIBCPP_USE_WCHAR_T 00048 // Extensions to use icov for dealing with character encodings, 00049 // including conversions and comparisons between various character 00050 // sets. This object encapsulates data that may need to be shared between 00051 // char_traits, codecvt and ctype. 00052 00053 #if _GLIBCPP_USE_SHADOW_HEADERS 00054 using _C_legacy::CODESET; 00055 #endif 00056 00057 class __enc_traits 00058 { 00059 public: 00060 // Types: 00061 // NB: A conversion descriptor subsumes and enhances the 00062 // functionality of a simple state type such as mbstate_t. 00063 typedef iconv_t __desc_type; 00064 00065 protected: 00066 // Data Members: 00067 // Max size of charset encoding name 00068 static const int _S_max_size = 32; 00069 // Name of internal character set encoding. 00070 char _M_int_enc[_S_max_size]; 00071 // Name of external character set encoding. 00072 char _M_ext_enc[_S_max_size]; 00073 00074 // Conversion descriptor between external encoding to internal encoding. 00075 __desc_type _M_in_desc; 00076 // Conversion descriptor between internal encoding to external encoding. 00077 __desc_type _M_out_desc; 00078 00079 // Details the byte-order marker for the external encoding, if necessary. 00080 int _M_ext_bom; 00081 00082 // Details the byte-order marker for the internal encoding, if necessary. 00083 int _M_int_bom; 00084 00085 public: 00086 __enc_traits() 00087 : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) 00088 { 00089 // __intc_end = whatever we are using internally, which is 00090 // UCS4 (linux) 00091 // UCS2 == UNICODE (microsoft, java, aix, whatever...) 00092 // XXX Currently don't know how to get this data from target system... 00093 strcpy(_M_int_enc, "UCS4"); 00094 00095 // __extc_end = external codeset in current locale 00096 strcpy(_M_ext_enc, nl_langinfo(CODESET)); 00097 } 00098 00099 __enc_traits(const char* __int, const char* __ext, int __ibom = 0, 00100 int __ebom = 0) 00101 : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) 00102 { 00103 strncpy(_M_int_enc, __int, _S_max_size); 00104 strncpy(_M_ext_enc, __ext, _S_max_size); 00105 } 00106 00107 // 21.1.2 traits typedefs 00108 // p4 00109 // typedef STATE_T state_type 00110 // requires: state_type shall meet the requirements of 00111 // CopyConstructible types (20.1.3) 00112 __enc_traits(const __enc_traits& __obj) 00113 { 00114 strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); 00115 strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); 00116 _M_ext_bom = __obj._M_ext_bom; 00117 _M_int_bom = __obj._M_int_bom; 00118 } 00119 00120 ~__enc_traits() 00121 { 00122 iconv_close(_M_in_desc); 00123 iconv_close(_M_out_desc); 00124 } 00125 00126 // Initializes 00127 void 00128 _M_init() 00129 { 00130 _M_in_desc = iconv_open(_M_int_enc, _M_ext_enc); 00131 _M_out_desc = iconv_open(_M_ext_enc, _M_int_enc); 00132 if (_M_out_desc == iconv_t(-1) || _M_in_desc == iconv_t(-1)) 00133 { 00134 // XXX Extended error checking. 00135 } 00136 } 00137 00138 bool 00139 _M_good() 00140 { 00141 return _M_out_desc && _M_in_desc 00142 && _M_out_desc != iconv_t(-1) && _M_in_desc != iconv_t(-1); 00143 } 00144 00145 const __desc_type* 00146 _M_get_in_descriptor() 00147 { return &_M_in_desc; } 00148 00149 const __desc_type* 00150 _M_get_out_descriptor() 00151 { return &_M_out_desc; } 00152 00153 const char* 00154 _M_get_internal_enc() 00155 { return _M_int_enc; } 00156 00157 const char* 00158 _M_get_external_enc() 00159 { return _M_ext_enc; } 00160 00161 int 00162 _M_get_external_bom() 00163 { return _M_ext_bom; } 00164 00165 int 00166 _M_get_internal_bom() 00167 { return _M_int_bom; } 00168 }; 00169 #endif //_GLIBCPP_USE_WCHAR_T 00170 00171 00172 // 22.2.1.5 Template class codecvt 00173 class codecvt_base 00174 { 00175 public: 00176 enum result 00177 { 00178 ok, 00179 partial, 00180 error, 00181 noconv 00182 }; 00183 }; 00184 00185 // Template class __codecvt_abstract_base 00186 // NB: An abstract base class that fills in the public inlines, so 00187 // that the specializations don't have to re-copy the public 00188 // interface. 00189 template<typename _InternT, typename _ExternT, typename _StateT> 00190 class __codecvt_abstract_base 00191 : public locale::facet, public codecvt_base 00192 { 00193 public: 00194 // Types: 00195 typedef codecvt_base::result result; 00196 typedef _InternT intern_type; 00197 typedef _ExternT extern_type; 00198 typedef _StateT state_type; 00199 00200 // 22.2.1.5.1 codecvt members 00201 result 00202 out(state_type& __state, const intern_type* __from, 00203 const intern_type* __from_end, const intern_type*& __from_next, 00204 extern_type* __to, extern_type* __to_end, 00205 extern_type*& __to_next) const 00206 { 00207 return this->do_out(__state, __from, __from_end, __from_next, 00208 __to, __to_end, __to_next); 00209 } 00210 00211 result 00212 unshift(state_type& __state, extern_type* __to, extern_type* __to_end, 00213 extern_type*& __to_next) const 00214 { return this->do_unshift(__state, __to,__to_end,__to_next); } 00215 00216 result 00217 in(state_type& __state, const extern_type* __from, 00218 const extern_type* __from_end, const extern_type*& __from_next, 00219 intern_type* __to, intern_type* __to_end, 00220 intern_type*& __to_next) const 00221 { 00222 return this->do_in(__state, __from, __from_end, __from_next, 00223 __to, __to_end, __to_next); 00224 } 00225 00226 int 00227 encoding() const throw() 00228 { return this->do_encoding(); } 00229 00230 bool 00231 always_noconv() const throw() 00232 { return this->do_always_noconv(); } 00233 00234 int 00235 length(const state_type& __state, const extern_type* __from, 00236 const extern_type* __end, size_t __max) const 00237 { return this->do_length(__state, __from, __end, __max); } 00238 00239 int 00240 max_length() const throw() 00241 { return this->do_max_length(); } 00242 00243 protected: 00244 explicit 00245 __codecvt_abstract_base(size_t __refs = 0) : locale::facet(__refs) { } 00246 00247 virtual 00248 ~__codecvt_abstract_base() { } 00249 00250 virtual result 00251 do_out(state_type& __state, const intern_type* __from, 00252 const intern_type* __from_end, const intern_type*& __from_next, 00253 extern_type* __to, extern_type* __to_end, 00254 extern_type*& __to_next) const = 0; 00255 00256 virtual result 00257 do_unshift(state_type& __state, extern_type* __to, 00258 extern_type* __to_end, extern_type*& __to_next) const = 0; 00259 00260 virtual result 00261 do_in(state_type& __state, const extern_type* __from, 00262 const extern_type* __from_end, const extern_type*& __from_next, 00263 intern_type* __to, intern_type* __to_end, 00264 intern_type*& __to_next) const = 0; 00265 00266 virtual int 00267 do_encoding() const throw() = 0; 00268 00269 virtual bool 00270 do_always_noconv() const throw() = 0; 00271 00272 virtual int 00273 do_length(const state_type&, const extern_type* __from, 00274 const extern_type* __end, size_t __max) const = 0; 00275 00276 virtual int 00277 do_max_length() const throw() = 0; 00278 }; 00279 00280 // 22.2.1.5 Template class codecvt 00281 // NB: Generic, mostly useless implementation. 00282 template<typename _InternT, typename _ExternT, typename _StateT> 00283 class codecvt 00284 : public __codecvt_abstract_base<_InternT, _ExternT, _StateT> 00285 { 00286 public: 00287 // Types: 00288 typedef codecvt_base::result result; 00289 typedef _InternT intern_type; 00290 typedef _ExternT extern_type; 00291 typedef _StateT state_type; 00292 00293 // Data Members: 00294 static locale::id id; 00295 00296 explicit 00297 codecvt(size_t __refs = 0) 00298 : __codecvt_abstract_base<_InternT,_ExternT,_StateT> (__refs) { } 00299 00300 protected: 00301 virtual 00302 ~codecvt() { } 00303 }; 00304 00305 template<typename _InternT, typename _ExternT, typename _StateT> 00306 locale::id codecvt<_InternT, _ExternT, _StateT>::id; 00307 00308 #ifdef _GLIBCPP_USE_WCHAR_T 00309 // partial specialization 00310 // This specialization takes advantage of iconv to provide code 00311 // conversions between a large number of character encodings. 00312 template<typename _InternT, typename _ExternT> 00313 class codecvt<_InternT, _ExternT, __enc_traits> 00314 : public __codecvt_abstract_base<_InternT, _ExternT, __enc_traits> 00315 { 00316 public: 00317 // Types: 00318 typedef codecvt_base::result result; 00319 typedef _InternT intern_type; 00320 typedef _ExternT extern_type; 00321 typedef __enc_traits state_type; 00322 typedef __enc_traits::__desc_type __desc_type; 00323 typedef __enc_traits __enc_type; 00324 00325 // Data Members: 00326 static locale::id id; 00327 00328 explicit 00329 codecvt(size_t __refs = 0) 00330 : __codecvt_abstract_base<intern_type, extern_type, state_type>(__refs) 00331 { } 00332 00333 explicit 00334 codecvt(__enc_type* __enc, size_t __refs = 0) 00335 : __codecvt_abstract_base<intern_type, extern_type, state_type>(__refs) 00336 { } 00337 00338 protected: 00339 virtual 00340 ~codecvt() { } 00341 00342 virtual result 00343 do_out(state_type& __state, const intern_type* __from, 00344 const intern_type* __from_end, const intern_type*& __from_next, 00345 extern_type* __to, extern_type* __to_end, 00346 extern_type*& __to_next) const; 00347 00348 virtual result 00349 do_unshift(state_type& __state, extern_type* __to, 00350 extern_type* __to_end, extern_type*& __to_next) const; 00351 00352 virtual result 00353 do_in(state_type& __state, const extern_type* __from, 00354 const extern_type* __from_end, const extern_type*& __from_next, 00355 intern_type* __to, intern_type* __to_end, 00356 intern_type*& __to_next) const; 00357 00358 virtual int 00359 do_encoding() const throw(); 00360 00361 virtual bool 00362 do_always_noconv() const throw(); 00363 00364 virtual int 00365 do_length(const state_type&, const extern_type* __from, 00366 const extern_type* __end, size_t __max) const; 00367 00368 virtual int 00369 do_max_length() const throw(); 00370 }; 00371 00372 template<typename _InternT, typename _ExternT> 00373 locale::id 00374 codecvt<_InternT, _ExternT, __enc_traits>::id; 00375 00376 // This adaptor works around the signature problems of the second 00377 // argument to iconv(): SUSv2 and others use 'const char**', but glibc 2.2 00378 // uses 'char**', which is what the standard is (apparently) due to use 00379 // in the future. Using this adaptor, g++ will do the work for us. 00380 template<typename _T> 00381 inline size_t 00382 __iconv_adaptor(size_t(*iconv_func)(iconv_t, _T, size_t*, char**, size_t*), 00383 iconv_t cd, char** inbuf, size_t* inbytesleft, 00384 char** outbuf, size_t* outbytesleft) 00385 { 00386 return iconv_func(cd, (_T)inbuf, inbytesleft, outbuf, outbytesleft); 00387 } 00388 00389 template<typename _InternT, typename _ExternT> 00390 codecvt_base::result 00391 00392 codecvt<_InternT, _ExternT, __enc_traits>:: do_out(state_type& __state, const intern_type* __from, 00393 const intern_type* __from_end, const intern_type*& __from_next, 00394 extern_type* __to, extern_type* __to_end, 00395 extern_type*& __to_next) const 00396 { 00397 result __ret = codecvt::error; 00398 if (__state._M_good()) 00399 { 00400 typedef state_type::__desc_type __desc_type; 00401 const __desc_type* __desc = __state._M_get_out_descriptor(); 00402 const size_t __fmultiple = sizeof(intern_type) / sizeof(char); 00403 size_t __flen = __fmultiple * (__from_end - __from); 00404 const size_t __tmultiple = sizeof(extern_type) / sizeof(char); 00405 size_t __tlen = __tmultiple * (__to_end - __to); 00406 00407 // Argument list for iconv specifies a byte sequence. Thus, 00408 // all to/from arrays must be brutally casted to char*. 00409 char* __cto = reinterpret_cast<char*>(__to); 00410 char* __cfrom; 00411 size_t __conv; 00412 00413 // Some encodings need a byte order marker as the first item 00414 // in the byte stream, to designate endian-ness. The default 00415 // value for the byte order marker is NULL, so if this is 00416 // the case, it's not necessary and we can just go on our 00417 // merry way. 00418 int __int_bom = __state._M_get_internal_bom(); 00419 if (__int_bom) 00420 { 00421 size_t __size = __from_end - __from; 00422 intern_type* __cfixed = static_cast<intern_type*>(__builtin_alloca(sizeof(intern_type) * (__size + 1))); 00423 __cfixed[0] = static_cast<intern_type>(__int_bom); 00424 char_traits<intern_type>::copy(__cfixed + 1, __from, __size); 00425 __cfrom = reinterpret_cast<char*>(__cfixed); 00426 __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, 00427 &__flen, &__cto, &__tlen); 00428 } 00429 else 00430 { 00431 intern_type* __cfixed = const_cast<intern_type*>(__from); 00432 __cfrom = reinterpret_cast<char*>(__cfixed); 00433 __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, 00434 &__flen, &__cto, &__tlen); 00435 } 00436 00437 if (__conv != size_t(-1)) 00438 { 00439 __from_next = reinterpret_cast<const intern_type*>(__cfrom); 00440 __to_next = reinterpret_cast<extern_type*>(__cto); 00441 __ret = codecvt::ok; 00442 } 00443 else 00444 { 00445 if (__flen < static_cast<size_t>(__from_end - __from)) 00446 { 00447 __from_next = reinterpret_cast<const intern_type*>(__cfrom); 00448 __to_next = reinterpret_cast<extern_type*>(__cto); 00449 __ret = codecvt::partial; 00450 } 00451 else 00452 __ret = codecvt::error; 00453 } 00454 } 00455 return __ret; 00456 } 00457 00458 template<typename _InternT, typename _ExternT> 00459 codecvt_base::result 00460 00461 codecvt<_InternT, _ExternT, __enc_traits>:: do_unshift(state_type& __state, extern_type* __to, 00462 extern_type* __to_end, extern_type*& __to_next) const 00463 { 00464 result __ret = codecvt::error; 00465 if (__state._M_good()) 00466 { 00467 typedef state_type::__desc_type __desc_type; 00468 const __desc_type* __desc = __state._M_get_in_descriptor(); 00469 const size_t __tmultiple = sizeof(intern_type) / sizeof(char); 00470 size_t __tlen = __tmultiple * (__to_end - __to); 00471 00472 // Argument list for iconv specifies a byte sequence. Thus, 00473 // all to/from arrays must be brutally casted to char*. 00474 char* __cto = reinterpret_cast<char*>(__to); 00475 size_t __conv = __iconv_adaptor(iconv,*__desc, NULL, NULL, 00476 &__cto, &__tlen); 00477 00478 if (__conv != size_t(-1)) 00479 { 00480 __to_next = reinterpret_cast<extern_type*>(__cto); 00481 if (__tlen == __tmultiple * (__to_end - __to)) 00482 __ret = codecvt::noconv; 00483 else if (__tlen == 0) 00484 __ret = codecvt::ok; 00485 else 00486 __ret = codecvt::partial; 00487 } 00488 else 00489 __ret = codecvt::error; 00490 } 00491 return __ret; 00492 } 00493 00494 template<typename _InternT, typename _ExternT> 00495 codecvt_base::result 00496 00497 codecvt<_InternT, _ExternT, __enc_traits>:: do_in(state_type& __state, const extern_type* __from, 00498 const extern_type* __from_end, const extern_type*& __from_next, 00499 intern_type* __to, intern_type* __to_end, 00500 intern_type*& __to_next) const 00501 { 00502 result __ret = codecvt::error; 00503 if (__state._M_good()) 00504 { 00505 typedef state_type::__desc_type __desc_type; 00506 const __desc_type* __desc = __state._M_get_in_descriptor(); 00507 const size_t __fmultiple = sizeof(extern_type) / sizeof(char); 00508 size_t __flen = __fmultiple * (__from_end - __from); 00509 const size_t __tmultiple = sizeof(intern_type) / sizeof(char); 00510 size_t __tlen = __tmultiple * (__to_end - __to); 00511 00512 // Argument list for iconv specifies a byte sequence. Thus, 00513 // all to/from arrays must be brutally casted to char*. 00514 char* __cto = reinterpret_cast<char*>(__to); 00515 char* __cfrom; 00516 size_t __conv; 00517 00518 // Some encodings need a byte order marker as the first item 00519 // in the byte stream, to designate endian-ness. The default 00520 // value for the byte order marker is NULL, so if this is 00521 // the case, it's not necessary and we can just go on our 00522 // merry way. 00523 int __ext_bom = __state._M_get_external_bom(); 00524 if (__ext_bom) 00525 { 00526 size_t __size = __from_end - __from; 00527 extern_type* __cfixed = static_cast<extern_type*>(__builtin_alloca(sizeof(extern_type) * (__size + 1))); 00528 __cfixed[0] = static_cast<extern_type>(__ext_bom); 00529 char_traits<extern_type>::copy(__cfixed + 1, __from, __size); 00530 __cfrom = reinterpret_cast<char*>(__cfixed); 00531 __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, 00532 &__flen, &__cto, &__tlen); 00533 } 00534 else 00535 { 00536 extern_type* __cfixed = const_cast<extern_type*>(__from); 00537 __cfrom = reinterpret_cast<char*>(__cfixed); 00538 __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, 00539 &__flen, &__cto, &__tlen); 00540 } 00541 00542 00543 if (__conv != size_t(-1)) 00544 { 00545 __from_next = reinterpret_cast<const extern_type*>(__cfrom); 00546 __to_next = reinterpret_cast<intern_type*>(__cto); 00547 __ret = codecvt::ok; 00548 } 00549 else 00550 { 00551 if (__flen < static_cast<size_t>(__from_end - __from)) 00552 { 00553 __from_next = reinterpret_cast<const extern_type*>(__cfrom); 00554 __to_next = reinterpret_cast<intern_type*>(__cto); 00555 __ret = codecvt::partial; 00556 } 00557 else 00558 __ret = codecvt::error; 00559 } 00560 } 00561 return __ret; 00562 } 00563 00564 template<typename _InternT, typename _ExternT> 00565 int 00566 00567 codecvt<_InternT, _ExternT, __enc_traits>:: do_encoding() const throw() 00568 { return 0; } 00569 00570 template<typename _InternT, typename _ExternT> 00571 bool 00572 00573 codecvt<_InternT, _ExternT, __enc_traits>:: do_always_noconv() const throw() 00574 { return false; } 00575 00576 template<typename _InternT, typename _ExternT> 00577 int 00578 00579 codecvt<_InternT, _ExternT, __enc_traits>:: do_length(const state_type&, const extern_type* __from, 00580 const extern_type* __end, size_t __max) const 00581 { return min(__max, static_cast<size_t>(__end - __from)); } 00582 00583 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 00584 // 74. Garbled text for codecvt::do_max_length 00585 template<typename _InternT, typename _ExternT> 00586 int 00587 00588 codecvt<_InternT, _ExternT, __enc_traits>:: do_max_length() const throw() 00589 { return 1; } 00590 #endif 00591 #endif /* _GLIBCPP_USE_WCHAR_T */ 00592 00593 // codecvt<char, char, mbstate_t> required specialization 00594 template<> 00595 class codecvt<char, char, mbstate_t> 00596 : public __codecvt_abstract_base<char, char, mbstate_t> 00597 { 00598 public: 00599 // Types: 00600 typedef char intern_type; 00601 typedef char extern_type; 00602 typedef mbstate_t state_type; 00603 00604 // Data Members: 00605 static locale::id id; 00606 00607 explicit 00608 codecvt(size_t __refs = 0); 00609 00610 protected: 00611 virtual 00612 ~codecvt(); 00613 00614 virtual result 00615 do_out(state_type& __state, const intern_type* __from, 00616 const intern_type* __from_end, const intern_type*& __from_next, 00617 extern_type* __to, extern_type* __to_end, 00618 extern_type*& __to_next) const; 00619 00620 virtual result 00621 do_unshift(state_type& __state, extern_type* __to, 00622 extern_type* __to_end, extern_type*& __to_next) const; 00623 00624 virtual result 00625 do_in(state_type& __state, const extern_type* __from, 00626 const extern_type* __from_end, const extern_type*& __from_next, 00627 intern_type* __to, intern_type* __to_end, 00628 intern_type*& __to_next) const; 00629 00630 virtual int 00631 do_encoding() const throw(); 00632 00633 virtual bool 00634 do_always_noconv() const throw(); 00635 00636 virtual int 00637 do_length(const state_type&, const extern_type* __from, 00638 const extern_type* __end, size_t __max) const; 00639 00640 virtual int 00641 do_max_length() const throw(); 00642 }; 00643 00644 #ifdef _GLIBCPP_USE_WCHAR_T 00645 // codecvt<wchar_t, char, mbstate_t> required specialization 00646 template<> 00647 class codecvt<wchar_t, char, mbstate_t> 00648 : public __codecvt_abstract_base<wchar_t, char, mbstate_t> 00649 { 00650 public: 00651 // Types: 00652 typedef wchar_t intern_type; 00653 typedef char extern_type; 00654 typedef mbstate_t state_type; 00655 00656 // Data Members: 00657 static locale::id id; 00658 00659 explicit 00660 codecvt(size_t __refs = 0); 00661 00662 protected: 00663 virtual 00664 ~codecvt(); 00665 00666 virtual result 00667 do_out(state_type& __state, const intern_type* __from, 00668 const intern_type* __from_end, const intern_type*& __from_next, 00669 extern_type* __to, extern_type* __to_end, 00670 extern_type*& __to_next) const; 00671 00672 virtual result 00673 do_unshift(state_type& __state, 00674 extern_type* __to, extern_type* __to_end, 00675 extern_type*& __to_next) const; 00676 00677 virtual result 00678 do_in(state_type& __state, 00679 const extern_type* __from, const extern_type* __from_end, 00680 const extern_type*& __from_next, 00681 intern_type* __to, intern_type* __to_end, 00682 intern_type*& __to_next) const; 00683 00684 virtual 00685 int do_encoding() const throw(); 00686 00687 virtual 00688 bool do_always_noconv() const throw(); 00689 00690 virtual 00691 int do_length(const state_type&, const extern_type* __from, 00692 const extern_type* __end, size_t __max) const; 00693 00694 virtual int 00695 do_max_length() const throw(); 00696 }; 00697 #endif //_GLIBCPP_USE_WCHAR_T 00698 00699 // 22.2.1.6 Template class codecvt_byname 00700 template<typename _InternT, typename _ExternT, typename _StateT> 00701 class codecvt_byname : public codecvt<_InternT, _ExternT, _StateT> 00702 { 00703 public: 00704 explicit 00705 codecvt_byname(const char*, size_t __refs = 0) 00706 : codecvt<_InternT, _ExternT, _StateT>(__refs) { } 00707 protected: 00708 virtual 00709 ~codecvt_byname() { } 00710 }; 00711 00712 #endif // _CPP_BITS_CODECVT_H 00713 00714 // Local Variables: 00715 // mode:c++ 00716 // End: 00717 Generated on Mon Apr 8 03:11:23 2002 for libstdc++-v3 Source by 1.2.15 |