summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorpme <pme@138bc75d-0d04-0410-961f-82ee72b054a4>2000-11-11 00:37:45 +0000
committerpme <pme@138bc75d-0d04-0410-961f-82ee72b054a4>2000-11-11 00:37:45 +0000
commitd1d224a6ad3a4980c51c2b47f4c753c272a348ad (patch)
treed8e06c790e2f0d1609f45833171e8778efd60d80 /libstdc++-v3
parenta7536ed8b225df4f61447dd12d313cbbad68707c (diff)
downloadgcc-d1d224a6ad3a4980c51c2b47f4c753c272a348ad.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37379 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/include/bits/codecvt.h40
2 files changed, 36 insertions, 11 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 7f754db5dd0..be17c8e6ab0 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,10 @@
+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>
* include/bits/cpp_type_traits.h: Fix typos. Adjust formatting.
diff --git a/libstdc++-v3/include/bits/codecvt.h b/libstdc++-v3/include/bits/codecvt.h
index 1c0d4137436..97fc015509c 100644
--- a/libstdc++-v3/include/bits/codecvt.h
+++ b/libstdc++-v3/include/bits/codecvt.h
@@ -372,6 +372,19 @@ namespace std
locale::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>
codecvt_base::result
codecvt<_InternT, _ExternT, __enc_traits>::
@@ -393,7 +406,7 @@ namespace std
// Argument list for iconv specifies a byte sequence. Thus,
// all to/from arrays must be brutally casted to char*.
char* __cto = reinterpret_cast<char*>(__to);
- const char* __cfrom;
+ char* __cfrom;
size_t __conv;
// Some encodings need a byte order marker as the first item
@@ -408,14 +421,16 @@ namespace std
intern_type __cfixed[__size + 1];
__cfixed[0] = static_cast<intern_type>(__int_bom);
char_traits<intern_type>::copy(__cfixed + 1, __from, __size);
- __cfrom = reinterpret_cast<const char*>(__cfixed);
- __conv = iconv(*__desc, &__cfrom, &__flen, &__cto, &__tlen);
+ __cfrom = reinterpret_cast<char*>(__cfixed);
+ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom,
+ &__flen, &__cto, &__tlen);
}
else
{
intern_type* __cfixed = const_cast<intern_type*>(__from);
- __cfrom = reinterpret_cast<const char*>(__cfixed);
- __conv = iconv(*__desc, &__cfrom, &__flen, &__cto, &__tlen);
+ __cfrom = reinterpret_cast<char*>(__cfixed);
+ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom,
+ &__flen, &__cto, &__tlen);
}
if (__conv != size_t(-1))
@@ -456,7 +471,8 @@ namespace std
// Argument list for iconv specifies a byte sequence. Thus,
// all to/from arrays must be brutally casted to char*.
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))
{
@@ -495,7 +511,7 @@ namespace std
// Argument list for iconv specifies a byte sequence. Thus,
// all to/from arrays must be brutally casted to char*.
char* __cto = reinterpret_cast<char*>(__to);
- const char* __cfrom;
+ char* __cfrom;
size_t __conv;
// Some encodings need a byte order marker as the first item
@@ -510,14 +526,16 @@ namespace std
extern_type __cfixed[__size + 1];
__cfixed[0] = static_cast<extern_type>(__ext_bom);
char_traits<extern_type>::copy(__cfixed + 1, __from, __size);
- __cfrom = reinterpret_cast<const char*>(__cfixed);
- __conv = iconv(*__desc, &__cfrom, &__flen, &__cto, &__tlen);
+ __cfrom = reinterpret_cast<char*>(__cfixed);
+ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom,
+ &__flen, &__cto, &__tlen);
}
else
{
extern_type* __cfixed = const_cast<extern_type*>(__from);
- __cfrom = reinterpret_cast<const char*>(__cfixed);
- __conv = iconv(*__desc, &__cfrom, &__flen, &__cto, &__tlen);
+ __cfrom = reinterpret_cast<char*>(__cfixed);
+ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom,
+ &__flen, &__cto, &__tlen);
}