aboutsummaryrefslogtreecommitdiff
path: root/devel/boost-libs
diff options
context:
space:
mode:
authorTijl Coosemans <tijl@FreeBSD.org>2019-01-16 20:36:47 +0000
committerTijl Coosemans <tijl@FreeBSD.org>2019-01-16 20:36:47 +0000
commit6ddf470ea6a8941a4e2e04f0a4a3ba1c126b04fb (patch)
tree458f460cbf9aa00c4cf5efc9ac1f56b566582fb9 /devel/boost-libs
parent44a0b6fc9e6f62bddc96991b7bd5ef918998435a (diff)
downloadports-6ddf470ea6a8941a4e2e04f0a4a3ba1c126b04fb.tar.gz
ports-6ddf470ea6a8941a4e2e04f0a4a3ba1c126b04fb.zip
Fix use of iconv in Boost Locale. On FreeBSD it used __ICONV_F_HIDE_INVALID
which hides invalid sequences, but what Boost really wants is that iconv returns an error on invalid sequences like GNU libiconv does by default. On FreeBSD ICONV_SET_ILSEQ_INVALID can be used for this. It has to be set via iconvctl. PR: 215393
Notes
Notes: svn path=/head/; revision=490518
Diffstat (limited to 'devel/boost-libs')
-rw-r--r--devel/boost-libs/Makefile2
-rw-r--r--devel/boost-libs/files/patch-libs_locale_src_encoding_iconv_codepage.ipp11
-rw-r--r--devel/boost-libs/files/patch-libs_locale_src_posix_codecvt.cpp20
-rw-r--r--devel/boost-libs/files/patch-libs_locale_src_util_iconv.hpp49
4 files changed, 81 insertions, 1 deletions
diff --git a/devel/boost-libs/Makefile b/devel/boost-libs/Makefile
index 62f615e7518e..5478247eae7b 100644
--- a/devel/boost-libs/Makefile
+++ b/devel/boost-libs/Makefile
@@ -2,7 +2,7 @@
# $FreeBSD$
PORTNAME= boost-libs
-PORTREVISION= 0
+PORTREVISION= 1
COMMENT= Free portable C++ libraries (without Boost.Python)
diff --git a/devel/boost-libs/files/patch-libs_locale_src_encoding_iconv_codepage.ipp b/devel/boost-libs/files/patch-libs_locale_src_encoding_iconv_codepage.ipp
new file mode 100644
index 000000000000..fc02eeb06d9c
--- /dev/null
+++ b/devel/boost-libs/files/patch-libs_locale_src_encoding_iconv_codepage.ipp
@@ -0,0 +1,11 @@
+--- libs/locale/src/encoding/iconv_codepage.ipp.orig 2017-09-02 09:56:14 UTC
++++ libs/locale/src/encoding/iconv_codepage.ipp
+@@ -43,7 +43,7 @@ class iconverter_base { (public)
+ bool open(char const *to,char const *from,method_type how)
+ {
+ close();
+- cvt_ = iconv_open(to,from);
++ cvt_ = call_iconv_open(to,from);
+ how_ = how;
+ return cvt_ != (iconv_t)(-1);
+ }
diff --git a/devel/boost-libs/files/patch-libs_locale_src_posix_codecvt.cpp b/devel/boost-libs/files/patch-libs_locale_src_posix_codecvt.cpp
new file mode 100644
index 000000000000..068b70f1af81
--- /dev/null
+++ b/devel/boost-libs/files/patch-libs_locale_src_posix_codecvt.cpp
@@ -0,0 +1,20 @@
+--- libs/locale/src/posix/codecvt.cpp.orig 2017-09-02 09:56:14 UTC
++++ libs/locale/src/posix/codecvt.cpp
+@@ -38,7 +38,7 @@ namespace impl_posix {
+ iconv_t d = (iconv_t)(-1);
+ std::vector<uint32_t> first_byte_table;
+ try {
+- d = iconv_open(utf32_encoding(),encoding.c_str());
++ d = call_iconv_open(utf32_encoding(),encoding.c_str());
+ if(d == (iconv_t)(-1)) {
+ throw std::runtime_error("Unsupported encoding" + encoding);
+ }
+@@ -186,7 +186,7 @@ namespace impl_posix {
+ {
+ if(d!=(iconv_t)(-1))
+ return;
+- d=iconv_open(to,from);
++ d=call_iconv_open(to,from);
+ }
+
+ static char const *utf32_encoding()
diff --git a/devel/boost-libs/files/patch-libs_locale_src_util_iconv.hpp b/devel/boost-libs/files/patch-libs_locale_src_util_iconv.hpp
new file mode 100644
index 000000000000..abe591f35234
--- /dev/null
+++ b/devel/boost-libs/files/patch-libs_locale_src_util_iconv.hpp
@@ -0,0 +1,49 @@
+--- libs/locale/src/util/iconv.hpp.orig 2017-09-02 09:56:14 UTC
++++ libs/locale/src/util/iconv.hpp
+@@ -12,27 +12,7 @@
+
+ namespace boost {
+ namespace locale {
+-#if defined(__ICONV_F_HIDE_INVALID) && defined(__FreeBSD__)
+ extern "C" {
+- typedef size_t (*const_iconv_ptr_type)(iconv_t d,char const **in,size_t *insize,char **out,size_t *outsize,uint32_t,size_t *);
+- typedef size_t (*nonconst_iconv_ptr_type)(iconv_t d,char **in,size_t *insize,char **out,size_t *outsize,uint32_t,size_t *);
+- }
+- inline size_t do_iconv(const_iconv_ptr_type ptr,iconv_t d,char **in,size_t *insize,char **out,size_t *outsize)
+- {
+- char const **rin = const_cast<char const **>(in);
+- return ptr(d,rin,insize,out,outsize,__ICONV_F_HIDE_INVALID,0);
+- }
+- inline size_t do_iconv(nonconst_iconv_ptr_type ptr,iconv_t d,char **in,size_t *insize,char **out,size_t *outsize)
+- {
+- return ptr(d,in,insize,out,outsize,__ICONV_F_HIDE_INVALID,0);
+- }
+- inline size_t call_iconv(iconv_t d,char **in,size_t *insize,char **out,size_t *outsize)
+- {
+- char const **rin = const_cast<char const **>(in);
+- return do_iconv(__iconv, d, in,insize,out,outsize);
+- }
+-#else
+- extern "C" {
+ typedef size_t (*gnu_iconv_ptr_type)(iconv_t d,char const **in,size_t *insize,char **out,size_t *outsize);
+ typedef size_t (*posix_iconv_ptr_type)(iconv_t d,char **in,size_t *insize,char **out,size_t *outsize);
+ }
+@@ -49,8 +29,17 @@ namespace boost {
+ {
+ return do_iconv( iconv, d, in,insize,out,outsize);
+ }
++ inline iconv_t call_iconv_open(char const *to,char const *from)
++ {
++ iconv_t d = iconv_open(to,from);
++#if defined(ICONV_SET_ILSEQ_INVALID) && defined(__FreeBSD__)
++ if(d != (iconv_t)(-1)) {
++ int ilseq_invalid = 1;
++ iconvctl(d,ICONV_SET_ILSEQ_INVALID,&ilseq_invalid);
++ }
+ #endif
+-
++ return d;
++ }
+ } // locale
+ } // boost
+