Commit 585ddf9c by Phil Edwards

codecvt.h (__iconv_adaptor): New adaptor function...

2000-11-10  Phil Edwards  <pme@sources.redhat.com>

	* include/bits/codecvt.h (__iconv_adaptor):  New adaptor function,
	  courtesy of Alexandre Oliva, to handle const/non-const signatures.
	  (codecvt::do_out):  Use.
	  (codecvt::do_in):  And here.

From-SVN: r37379
parent d2ea6600
2000-11-10 Phil Edwards <pme@sources.redhat.com>
* include/bits/codecvt.h (__iconv_adaptor): New adaptor function,
courtesy of Alexandre Oliva, to handle const/non-const signatures.
(codecvt::do_out): Use.
(codecvt::do_in): And here.
2000-11-10 Gabriel Dos Reis <gdr@codesourcery.com> 2000-11-10 Gabriel Dos Reis <gdr@codesourcery.com>
* include/bits/cpp_type_traits.h: Fix typos. Adjust formatting. * include/bits/cpp_type_traits.h: Fix typos. Adjust formatting.
......
...@@ -372,6 +372,19 @@ namespace std ...@@ -372,6 +372,19 @@ namespace std
locale::id locale::id
codecvt<_InternT, _ExternT, __enc_traits>::id; codecvt<_InternT, _ExternT, __enc_traits>::id;
// This adaptor works around the signature problems of the second
// argument to iconv(): SUSv2 and others use 'const char**', but glibc 2.2
// uses 'char**', which is what the standard is (apparently) due to use
// in the future. Using this adaptor, g++ will do the work for us.
template<typename _T>
inline size_t
__iconv_adaptor(size_t(*iconv_func)(iconv_t, _T, size_t *, char**, size_t*),
iconv_t cd, char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft)
{
return iconv_func (cd, (_T)inbuf, inbytesleft, outbuf, outbytesleft);
}
template<typename _InternT, typename _ExternT> template<typename _InternT, typename _ExternT>
codecvt_base::result codecvt_base::result
codecvt<_InternT, _ExternT, __enc_traits>:: codecvt<_InternT, _ExternT, __enc_traits>::
...@@ -393,7 +406,7 @@ namespace std ...@@ -393,7 +406,7 @@ namespace std
// Argument list for iconv specifies a byte sequence. Thus, // Argument list for iconv specifies a byte sequence. Thus,
// all to/from arrays must be brutally casted to char*. // all to/from arrays must be brutally casted to char*.
char* __cto = reinterpret_cast<char*>(__to); char* __cto = reinterpret_cast<char*>(__to);
const char* __cfrom; char* __cfrom;
size_t __conv; size_t __conv;
// Some encodings need a byte order marker as the first item // Some encodings need a byte order marker as the first item
...@@ -408,14 +421,16 @@ namespace std ...@@ -408,14 +421,16 @@ namespace std
intern_type __cfixed[__size + 1]; intern_type __cfixed[__size + 1];
__cfixed[0] = static_cast<intern_type>(__int_bom); __cfixed[0] = static_cast<intern_type>(__int_bom);
char_traits<intern_type>::copy(__cfixed + 1, __from, __size); char_traits<intern_type>::copy(__cfixed + 1, __from, __size);
__cfrom = reinterpret_cast<const char*>(__cfixed); __cfrom = reinterpret_cast<char*>(__cfixed);
__conv = iconv(*__desc, &__cfrom, &__flen, &__cto, &__tlen); __conv = __iconv_adaptor(iconv, *__desc, &__cfrom,
&__flen, &__cto, &__tlen);
} }
else else
{ {
intern_type* __cfixed = const_cast<intern_type*>(__from); intern_type* __cfixed = const_cast<intern_type*>(__from);
__cfrom = reinterpret_cast<const char*>(__cfixed); __cfrom = reinterpret_cast<char*>(__cfixed);
__conv = iconv(*__desc, &__cfrom, &__flen, &__cto, &__tlen); __conv = __iconv_adaptor(iconv, *__desc, &__cfrom,
&__flen, &__cto, &__tlen);
} }
if (__conv != size_t(-1)) if (__conv != size_t(-1))
...@@ -456,7 +471,8 @@ namespace std ...@@ -456,7 +471,8 @@ namespace std
// Argument list for iconv specifies a byte sequence. Thus, // Argument list for iconv specifies a byte sequence. Thus,
// all to/from arrays must be brutally casted to char*. // all to/from arrays must be brutally casted to char*.
char* __cto = reinterpret_cast<char*>(__to); char* __cto = reinterpret_cast<char*>(__to);
size_t __conv = iconv(*__desc, NULL, NULL, &__cto, &__tlen); size_t __conv = __iconv_adaptor(iconv,*__desc, NULL, NULL,
&__cto, &__tlen);
if (__conv != size_t(-1)) if (__conv != size_t(-1))
{ {
...@@ -495,7 +511,7 @@ namespace std ...@@ -495,7 +511,7 @@ namespace std
// Argument list for iconv specifies a byte sequence. Thus, // Argument list for iconv specifies a byte sequence. Thus,
// all to/from arrays must be brutally casted to char*. // all to/from arrays must be brutally casted to char*.
char* __cto = reinterpret_cast<char*>(__to); char* __cto = reinterpret_cast<char*>(__to);
const char* __cfrom; char* __cfrom;
size_t __conv; size_t __conv;
// Some encodings need a byte order marker as the first item // Some encodings need a byte order marker as the first item
...@@ -510,14 +526,16 @@ namespace std ...@@ -510,14 +526,16 @@ namespace std
extern_type __cfixed[__size + 1]; extern_type __cfixed[__size + 1];
__cfixed[0] = static_cast<extern_type>(__ext_bom); __cfixed[0] = static_cast<extern_type>(__ext_bom);
char_traits<extern_type>::copy(__cfixed + 1, __from, __size); char_traits<extern_type>::copy(__cfixed + 1, __from, __size);
__cfrom = reinterpret_cast<const char*>(__cfixed); __cfrom = reinterpret_cast<char*>(__cfixed);
__conv = iconv(*__desc, &__cfrom, &__flen, &__cto, &__tlen); __conv = __iconv_adaptor(iconv, *__desc, &__cfrom,
&__flen, &__cto, &__tlen);
} }
else else
{ {
extern_type* __cfixed = const_cast<extern_type*>(__from); extern_type* __cfixed = const_cast<extern_type*>(__from);
__cfrom = reinterpret_cast<const char*>(__cfixed); __cfrom = reinterpret_cast<char*>(__cfixed);
__conv = iconv(*__desc, &__cfrom, &__flen, &__cto, &__tlen); __conv = __iconv_adaptor(iconv, *__desc, &__cfrom,
&__flen, &__cto, &__tlen);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment