111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1999
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Silicon Graphics Computer Systems, Inc.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1999
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Boris Fomitchev
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This material is provided "as is", with absolutely no warranty expressed
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * or implied. Any use is at your own risk.
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use or copy this software for any purpose is hereby granted
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * without fee, provided the above notices are retained on all copies.
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to modify the code and to distribute modified code is granted,
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided the above notices are retained, and a notice that the code was
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modified is included with the above copyright notice.
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// WARNING: This is an internal header file, included by other C++
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// standard library headers.  You should not attempt to use this header
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// file directly.
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_INTERNAL_CODECVT_H
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STLP_INTERNAL_CODECVT_H
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_C_LOCALE_H
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  include <stl/c_locale.h>
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_INTERNAL_LOCALE_H
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  include <stl/_locale.h>
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_INTERNAL_ALGOBASE_H
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  include <stl/_algobase.h>
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_BEGIN_NAMESPACE
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass _STLP_CLASS_DECLSPEC codecvt_base {
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  enum result {ok, partial, error, noconv};
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _InternT, class _ExternT, class _StateT>
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass codecvt : public locale::facet, public codecvt_base {
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _InternT intern_type;
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _ExternT extern_type;
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _StateT state_type;
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_MSVC) && (_STLP_MSVC < 1300)
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /* For the moment VC6 do not support this facet default implementation
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * because of the static locale::id instance. When VC6 see this definition
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * it goes crasy with locale::id static instances and all the has_facet tests
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * unit tests are failing.
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  explicit codecvt(size_t __refs = 0) : locale::facet(__refs) {}
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  result out(state_type&          __state,
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             const intern_type*   __from,
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             const intern_type*   __from_end,
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             const intern_type*&  __from_next,
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             extern_type*         __to,
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             extern_type*         __to_limit,
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             extern_type*&        __to_next) const {
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__from <= __from_end, _StlMsg_INVALID_ARGUMENT)
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__to <= __to_limit, _StlMsg_INVALID_ARGUMENT)
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return do_out(__state,
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                  __from, __from_end, __from_next,
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                  __to,   __to_limit, __to_next);
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  result unshift(state_type&    __state,
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 extern_type*   __to,
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 extern_type*   __to_limit,
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 extern_type*&  __to_next) const {
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__to <= __to_limit, _StlMsg_INVALID_ARGUMENT)
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return do_unshift(__state, __to, __to_limit, __to_next);
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  result in(state_type&         __state,
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const extern_type*  __from,
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const extern_type*  __from_end,
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const extern_type*& __from_next,
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            intern_type*        __to,
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            intern_type*        __to_limit,
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            intern_type*&       __to_next) const {
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__from <= __from_end, _StlMsg_INVALID_ARGUMENT)
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__to <= __to_limit, _StlMsg_INVALID_ARGUMENT)
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return do_in(__state,
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 __from, __from_end, __from_next,
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 __to,  __to_limit, __to_next);
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int encoding() const _STLP_NOTHROW { return do_encoding(); }
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  bool always_noconv() const _STLP_NOTHROW { return do_always_noconv(); }
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int length(state_type&  __state,
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             const extern_type* __from,
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             const extern_type* __from_end,
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             size_t             __max) const {
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__from <= __from_end, _StlMsg_INVALID_ARGUMENT)
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return do_length(__state, __from, __from_end, __max);
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int max_length() const _STLP_NOTHROW { return do_max_length(); }
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  static locale::id id;
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprotected:
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  ~codecvt() {}
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual result do_out(state_type&,
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const intern_type*  __from,
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const intern_type*,
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const intern_type*& __from_next,
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        extern_type*        __to,
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        extern_type*,
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        extern_type*&       __to_next) const
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  { __from_next = __from; __to_next   = __to; return noconv; }
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual result do_in (state_type&,
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const extern_type*  __from,
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const extern_type*,
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const extern_type*& __from_next,
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        intern_type*        __to,
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        intern_type*,
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        intern_type*&       __to_next) const
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  { __from_next = __from; __to_next = __to; return noconv; }
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual result do_unshift(state_type&,
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            extern_type* __to,
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            extern_type*,
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            extern_type*& __to_next) const
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  { __to_next = __to; return noconv; }
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual int do_encoding() const _STLP_NOTHROW
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  { return 1; }
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual bool do_always_noconv() const _STLP_NOTHROW
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  { return true; }
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual int do_length(state_type&,
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const extern_type* __from,
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const extern_type* __end,
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        size_t __max) const
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  { return (int)(min) ( __STATIC_CAST(size_t, (__end - __from)), __max); }
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual int do_max_length() const _STLP_NOTHROW
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  { return 1; }
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprivate:
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  codecvt(const codecvt<intern_type, extern_type, state_type>&);
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  codecvt<intern_type, extern_type, state_type>& operator = (const codecvt<intern_type, extern_type, state_type>&);
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    if !defined (__BORLANDC__) || (__BORLANDC__ >= 0x590)
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _InternT, class _ExternT, class _StateT>
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertlocale::id codecvt<_InternT, _ExternT, _StateT>::id;
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    endif
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _InternT, class _ExternT, class _StateT>
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass codecvt_byname : public codecvt<_InternT, _ExternT, _StateT> {};
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass _STLP_CLASS_DECLSPEC codecvt<char, char, mbstate_t>
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  : public locale::facet, public codecvt_base {
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef char       intern_type;
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef char       extern_type;
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef mbstate_t  state_type;
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  explicit codecvt(size_t __refs = 0) : locale::facet(__refs) {}
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  result out(state_type&   __state,
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             const char*  __from,
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             const char*  __from_end,
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             const char*& __from_next,
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             char*        __to,
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             char*        __to_limit,
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             char*&       __to_next) const {
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__from <= __from_end, _StlMsg_INVALID_ARGUMENT)
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__to <= __to_limit, _StlMsg_INVALID_ARGUMENT)
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return do_out(__state,
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                  __from, __from_end, __from_next,
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                  __to,   __to_limit, __to_next);
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  result unshift(state_type& __state,
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 char* __to, char* __to_limit, char*& __to_next) const {
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__to <= __to_limit, _StlMsg_INVALID_ARGUMENT)
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return do_unshift(__state, __to, __to_limit, __to_next);
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  result in(state_type&   __state,
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const char*  __from,
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const char*  __from_end,
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const char*& __from_next,
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            char*        __to,
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            char*        __to_limit,
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            char*&       __to_next) const {
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__from <= __from_end, _StlMsg_INVALID_ARGUMENT)
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__to <= __to_limit, _StlMsg_INVALID_ARGUMENT)
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return do_in(__state,
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 __from, __from_end, __from_next,
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 __to,   __to_limit, __to_next);
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int encoding() const _STLP_NOTHROW { return do_encoding(); }
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  bool always_noconv() const _STLP_NOTHROW { return do_always_noconv(); }
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int length(state_type& __state,
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             const char* __from, const char* __from_end,
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             size_t __max) const {
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__from <= __from_end, _StlMsg_INVALID_ARGUMENT)
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return do_length(__state, __from, __from_end, __max);
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int max_length() const _STLP_NOTHROW { return do_max_length(); }
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  static _STLP_STATIC_DECLSPEC locale::id id;
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprotected:
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  ~codecvt();
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual result do_out(state_type&   /* __state */,
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const char*  __from,
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const char*  /* __from_end */,
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const char*& __from_next,
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        char*        __to,
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        char*        /* __to_limit */,
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        char*&       __to_next) const;
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual result do_in (state_type&   /* __state */ ,
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const char*  __from,
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const char*  /* __from_end */,
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const char*& __from_next,
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        char*        __to,
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        char*        /* __to_end */,
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        char*&       __to_next) const;
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual result do_unshift(state_type& /* __state */,
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            char*      __to,
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            char*      /* __to_limit */,
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            char*&     __to_next) const;
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual int do_encoding() const _STLP_NOTHROW;
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual bool do_always_noconv() const _STLP_NOTHROW;
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual int do_length(state_type&  __state,
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const  char* __from,
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const  char* __end,
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        size_t __max) const;
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual int do_max_length() const _STLP_NOTHROW;
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprivate:
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  codecvt(const codecvt<char, char, mbstate_t>&);
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  codecvt<char, char, mbstate_t>& operator =(const codecvt<char, char, mbstate_t>&);
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# ifndef _STLP_NO_WCHAR_T
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass _STLP_CLASS_DECLSPEC codecvt<wchar_t, char, mbstate_t>
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  : public locale::facet, public codecvt_base {
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef wchar_t    intern_type;
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef char       extern_type;
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef mbstate_t  state_type;
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  explicit codecvt(size_t __refs = 0) : locale::facet(__refs) {}
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  result out(state_type&      __state,
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             const wchar_t*  __from,
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             const wchar_t*  __from_end,
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             const wchar_t*& __from_next,
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             char*           __to,
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             char*           __to_limit,
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             char*&          __to_next) const {
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__from <= __from_end, _StlMsg_INVALID_ARGUMENT)
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__to <= __to_limit, _StlMsg_INVALID_ARGUMENT)
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return do_out(__state,
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                  __from, __from_end, __from_next,
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                  __to,   __to_limit, __to_next);
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  result unshift(state_type& __state,
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 char*  __to, char*  __to_limit, char*& __to_next) const {
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__to <= __to_limit, _StlMsg_INVALID_ARGUMENT)
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return do_unshift(__state, __to, __to_limit, __to_next);
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  result in(state_type&   __state,
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const char*  __from,
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const char*  __from_end,
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const char*& __from_next,
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            wchar_t*     __to,
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            wchar_t*     __to_limit,
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            wchar_t*&    __to_next) const {
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__from <= __from_end, _StlMsg_INVALID_ARGUMENT)
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__to <= __to_limit, _StlMsg_INVALID_ARGUMENT)
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return do_in(__state,
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 __from, __from_end, __from_next,
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 __to,   __to_limit, __to_next);
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int encoding() const _STLP_NOTHROW { return do_encoding(); }
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  bool always_noconv() const _STLP_NOTHROW { return do_always_noconv(); }
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int length(state_type& __state,
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             const char* __from, const char* __from_end,
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             size_t __max) const {
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__from <= __from_end, _StlMsg_INVALID_ARGUMENT)
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return do_length(__state, __from, __from_end, __max);
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int max_length() const _STLP_NOTHROW { return do_max_length(); }
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  static _STLP_STATIC_DECLSPEC locale::id id;
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprotected:
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  ~codecvt();
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual result do_out(state_type&         __state,
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const wchar_t*  __from,
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const wchar_t*  __from_end,
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const wchar_t*& __from_next,
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        char*        __to,
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        char*        __to_limit,
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        char*&       __to_next) const;
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual result do_in (state_type&         __state,
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const char*  __from,
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const char*  __from_end,
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const char*& __from_next,
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        wchar_t*        __to,
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        wchar_t*        __to_limit,
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        wchar_t*&       __to_next) const;
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual result do_unshift(state_type&   __state,
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            char*  __to,
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            char*  __to_limit,
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            char*& __to_next) const;
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual int do_encoding() const _STLP_NOTHROW;
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual bool do_always_noconv() const _STLP_NOTHROW;
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual int do_length(state_type&  __state,
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const  char* __from,
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const  char* __end,
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        size_t __max) const;
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual int do_max_length() const _STLP_NOTHROW;
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprivate:
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  codecvt(const codecvt<wchar_t, char, mbstate_t>&);
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  codecvt<wchar_t, char, mbstate_t>& operator = (const codecvt<wchar_t, char, mbstate_t>&);
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass _STLP_CLASS_DECLSPEC codecvt_byname<char, char, mbstate_t>
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  : public codecvt<char, char, mbstate_t> {
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  explicit codecvt_byname(const char* __name, size_t __refs = 0);
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  ~codecvt_byname();
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprivate:
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  codecvt_byname(const codecvt_byname<char, char, mbstate_t>&);
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  codecvt_byname<char, char, mbstate_t>& operator =(const codecvt_byname<char, char, mbstate_t>&);
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# ifndef _STLP_NO_WCHAR_T
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass _STLP_CLASS_DECLSPEC codecvt_byname<wchar_t, char, mbstate_t>
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  : public codecvt<wchar_t, char, mbstate_t> {
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  friend class _Locale_impl;
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  explicit codecvt_byname(const char * __name, size_t __refs = 0);
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprotected:
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  ~codecvt_byname();
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual result do_out(state_type&         __state,
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const wchar_t*  __from,
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const wchar_t*  __from_end,
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const wchar_t*& __from_next,
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        char*        __to,
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        char*        __to_limit,
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        char*&       __to_next) const;
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual result do_in (state_type&         __state,
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const char*  __from,
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const char*  __from_end,
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const char*& __from_next,
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        wchar_t*        __to,
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        wchar_t*        __to_limit,
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        wchar_t*&       __to_next) const;
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual result do_unshift(state_type&   __state,
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            char*  __to,
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            char*  __to_limit,
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            char*& __to_next) const;
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual int do_encoding() const _STLP_NOTHROW;
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual bool do_always_noconv() const _STLP_NOTHROW;
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual int do_length(state_type&  __state,
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const  char* __from,
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        const  char* __end,
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                        size_t __max) const;
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  virtual int do_max_length() const _STLP_NOTHROW;
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprivate:
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  codecvt_byname(_Locale_codecvt* __cvt)
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_codecvt(__cvt) {}
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  codecvt_byname(const codecvt_byname<wchar_t, char, mbstate_t>&);
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  codecvt_byname<wchar_t, char, mbstate_t>& operator =(const codecvt_byname<wchar_t, char, mbstate_t>&);
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Locale_codecvt* _M_codecvt;
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_END_NAMESPACE
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_INTERNAL_CODECVT_H */
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Local Variables:
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// mode:C++
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// End:
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
443