summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--unicode/biditest2.C2
-rw-r--r--unicode/courier-unicode.h.in30
-rw-r--r--unicode/unicode_bidi.c2
-rw-r--r--unicode/unicodecpp.C137
4 files changed, 103 insertions, 68 deletions
diff --git a/unicode/biditest2.C b/unicode/biditest2.C
index 9792938..a9ab87d 100644
--- a/unicode/biditest2.C
+++ b/unicode/biditest2.C
@@ -337,6 +337,8 @@ void character_test()
case UNICODE_BIDI_TYPE_S:
case UNICODE_BIDI_TYPE_B:
levels.at(i)=paragraph;
+ default:
+ break;
}
}
diff --git a/unicode/courier-unicode.h.in b/unicode/courier-unicode.h.in
index d3c57b6..cc9dbbb 100644
--- a/unicode/courier-unicode.h.in
+++ b/unicode/courier-unicode.h.in
@@ -2132,13 +2132,13 @@ std::tuple<std::vector<unicode_bidi_level_t>,
int bidi_reorder(std::u32string &string,
std::vector<unicode_bidi_level_t> &levels,
- const std::function<void (size_t, size_t) noexcept>
- &reorder_callback=[](size_t, size_t) noexcept{});
+ const std::function<void (size_t, size_t)>
+ &reorder_callback=[](size_t, size_t){});
//! Dry-run reorder bidirectional text
void bidi_reorder(std::vector<unicode_bidi_level_t> &levels,
- const std::function<void (size_t, size_t) noexcept>
- &reorder_callback=[](size_t, size_t) noexcept{});
+ const std::function<void (size_t, size_t)>
+ &reorder_callback=[](size_t, size_t){});
//! Remove directional markers
@@ -2146,8 +2146,8 @@ void bidi_reorder(std::vector<unicode_bidi_level_t> &levels,
//! of the index (in the original string, of each removed marker.
void bidi_cleanup(std::u32string &string,
- const std::function<void (size_t) noexcept> &removed_callback=
- [](size_t) noexcept {});
+ const std::function<void (size_t)> &removed_callback=
+ [](size_t) {});
//! Also remove them from the embedding direction level buffer.
@@ -2155,8 +2155,8 @@ void bidi_cleanup(std::u32string &string,
int bidi_cleanup(std::u32string &string,
std::vector<unicode_bidi_level_t> &levels,
- const std::function<void (size_t) noexcept> &removed_callback=
- [](size_t) noexcept {});
+ const std::function<void (size_t)> &removed_callback=
+ [](size_t) {});
//! Remove directional markers and isolation markers.
@@ -2165,9 +2165,9 @@ int bidi_cleanup(std::u32string &string,
//! of the index (in the original string, of each removed marker.
void bidi_extra_cleanup(std::u32string &string,
- const std::function<void (size_t) noexcept>
+ const std::function<void (size_t)>
&removed_callback=
- [](size_t) noexcept {});
+ [](size_t) {});
//! Also remove them from the embedding direction level buffer.
@@ -2175,21 +2175,21 @@ void bidi_extra_cleanup(std::u32string &string,
int bidi_extra_cleanup(std::u32string &string,
std::vector<unicode_bidi_level_t> &levels,
- const std::function<void (size_t) noexcept>
+ const std::function<void (size_t)>
&removed_callback=
- [](size_t) noexcept {});
+ [](size_t) {});
//! Convert Unicode string from canonical rendering order to logical order.
int bidi_logical_order(std::u32string &string,
std::vector<unicode_bidi_level_t> &levels,
unicode_bidi_level_t paragraph_embedding,
- const std::function<void (size_t, size_t) noexcept>
+ const std::function<void (size_t, size_t)>
&lambda=[](size_t,size_t){});
//! Convert Unicode string from canonical rendering order to logical order.
void bidi_logical_order(std::vector<unicode_bidi_level_t> &levels,
unicode_bidi_level_t paragraph_embedding,
- const std::function<void (size_t, size_t) noexcept>
+ const std::function<void (size_t, size_t)>
&lambda);
//! Embed directional and isolation markers
@@ -2203,7 +2203,7 @@ int bidi_embed(const std::u32string &string,
const std::vector<unicode_bidi_level_t> &levels,
unicode_bidi_level_t paragraph_embedding,
const std::function<void (const char32_t *string,
- size_t n) noexcept> &lambda);
+ size_t n)> &lambda);
//! Embed directional and isolation markers
diff --git a/unicode/unicode_bidi.c b/unicode/unicode_bidi.c
index 1c83b18..79c4db5 100644
--- a/unicode/unicode_bidi.c
+++ b/unicode/unicode_bidi.c
@@ -2374,7 +2374,7 @@ void unicode_bidi_embed(const char32_t *string,
#ifdef BIDI_DEBUG
fprintf(DEBUGDUMP, " need marker=%d\n",
- need_marker);
+ need_marker.need_marker);
#endif
while (p->start < p->end)
diff --git a/unicode/unicodecpp.C b/unicode/unicodecpp.C
index 04d2893..e85633f 100644
--- a/unicode/unicodecpp.C
+++ b/unicode/unicodecpp.C
@@ -8,6 +8,7 @@
#include "courier-unicode.h"
#include <algorithm>
+#include <exception>
extern "C" {
@@ -591,14 +592,48 @@ unicode::bidi_calc(const std::u32string &s,
return ret;
}
+namespace {
+#if 0
+}
+#endif
+template<typename callable>
+struct cb_wrapper {
+
+ const std::function<callable> &cb;
+ std::exception_ptr caught;
+
+ cb_wrapper(const std::function<callable> &cb) : cb{cb}
+ {
+ }
+
+ template<typename ...Args> void operator()(Args && ...args)
+ {
+ try {
+ cb(std::forward<Args>(args)...);
+ } catch (...)
+ {
+ caught=std::current_exception();
+ }
+ }
+
+ void rethrow()
+ {
+ if (caught)
+ std::rethrow_exception(caught);
+ }
+};
+#if 0
+{
+#endif
+}
+
+
extern "C" {
static void reorder_callback(size_t i, size_t cnt,
void *arg)
{
- auto p=reinterpret_cast<const std::function<void (size_t,
- size_t)
- noexcept> *>
- (arg);
+ auto p=reinterpret_cast<cb_wrapper<void (size_t,
+ size_t)> *>(arg);
(*p)(i, cnt);
}
@@ -606,8 +641,7 @@ extern "C" {
int unicode::bidi_reorder(std::u32string &string,
std::vector<unicode_bidi_level_t> &levels,
- const std::function<void (size_t, size_t)
- noexcept> &lambda)
+ const std::function<void (size_t, size_t)> &lambda)
{
size_t s=string.size();
@@ -617,26 +651,29 @@ int unicode::bidi_reorder(std::u32string &string,
if (!s)
return 0;
+ cb_wrapper<void (size_t, size_t)> cb{lambda};
+
unicode_bidi_reorder(&string[0], &levels[0], s,
reorder_callback,
- const_cast<void *>
- (reinterpret_cast<const void *>(&lambda)));
+ reinterpret_cast<void *>(&cb));
+ cb.rethrow();
return 0;
}
void unicode::bidi_reorder(std::vector<unicode_bidi_level_t> &levels,
- const std::function<void (size_t, size_t)
- noexcept> &lambda)
+ const std::function<void (size_t, size_t)> &lambda)
{
size_t s=levels.size();
if (!s)
return;
+ cb_wrapper<void (size_t, size_t)> cb{lambda};
+
unicode_bidi_reorder(0, &levels[0], s, reorder_callback,
- const_cast<void *>
- (reinterpret_cast<const void *>(&lambda)));
+ reinterpret_cast<void *>(&cb));
+ cb.rethrow();
}
@@ -644,45 +681,43 @@ extern "C" {
static void removed_callback(size_t i,
void *arg)
{
- auto p=reinterpret_cast<const std::function<void (size_t)
- noexcept> *>
- (arg);
+ auto p=reinterpret_cast<cb_wrapper<void (size_t)> *>(arg);
(*p)(i);
}
}
void unicode::bidi_cleanup(std::u32string &string,
- const std::function<void (size_t) noexcept> &lambda)
+ const std::function<void (size_t)> &lambda)
{
if (string.empty())
return;
+ cb_wrapper<void (size_t)> cb{lambda};
+
size_t n=unicode_bidi_cleanup(&string[0],
0,
string.size(),
removed_callback,
- const_cast<void *>
- (reinterpret_cast<const void *>
- (&lambda)));
-
+ reinterpret_cast<void *>(&cb));
+ cb.rethrow();
string.resize(n);
}
int unicode::bidi_cleanup(std::u32string &string,
std::vector<unicode_bidi_level_t> &levels,
- const std::function<void (size_t) noexcept> &lambda)
+ const std::function<void (size_t)> &lambda)
{
if (levels.size() != string.size())
return -1;
+ cb_wrapper<void (size_t)> cb{lambda};
size_t n=unicode_bidi_cleanup(&string[0],
&levels[0],
string.size(),
removed_callback,
- const_cast<void *>
- (reinterpret_cast<const void *>
- (&lambda)));
+ reinterpret_cast<void *>(&cb));
+ cb.rethrow();
string.resize(n);
levels.resize(n);
@@ -691,39 +726,35 @@ int unicode::bidi_cleanup(std::u32string &string,
void unicode::bidi_extra_cleanup(std::u32string &string,
- const std::function<void (size_t) noexcept>
- &lambda)
+ const std::function<void (size_t)> &lambda)
{
if (string.empty())
return;
+ cb_wrapper<void (size_t)> cb{lambda};
size_t n=unicode_bidi_extra_cleanup(&string[0],
0,
string.size(),
removed_callback,
- const_cast<void *>
- (reinterpret_cast<const void *>
- (&lambda)));
-
+ reinterpret_cast<void *>(&cb));
+ cb.rethrow();
string.resize(n);
}
int unicode::bidi_extra_cleanup(std::u32string &string,
std::vector<unicode_bidi_level_t> &levels,
- const std::function<void (size_t) noexcept>
- &lambda)
+ const std::function<void (size_t)> &lambda)
{
if (levels.size() != string.size())
return -1;
+ cb_wrapper<void (size_t)> cb{lambda};
size_t n=unicode_bidi_extra_cleanup(&string[0],
&levels[0],
string.size(),
removed_callback,
- const_cast<void *>
- (reinterpret_cast<const void *>
- (&lambda)));
-
+ reinterpret_cast<void *>(&cb));
+ cb.rethrow();
string.resize(n);
levels.resize(n);
return 0;
@@ -732,8 +763,8 @@ int unicode::bidi_extra_cleanup(std::u32string &string,
int unicode::bidi_logical_order(std::u32string &string,
std::vector<unicode_bidi_level_t> &levels,
unicode_bidi_level_t paragraph_embedding,
- const std::function<void (size_t, size_t)
- noexcept> &lambda)
+ const std::function<void (size_t, size_t)>
+ &lambda)
{
if (string.size() != levels.size())
return -1;
@@ -741,27 +772,29 @@ int unicode::bidi_logical_order(std::u32string &string,
if (string.empty())
return 0;
+ cb_wrapper<void (size_t, size_t)> cb{lambda};
unicode_bidi_logical_order(&string[0], &levels[0], string.size(),
paragraph_embedding,
&reorder_callback,
- const_cast<void *>
- (reinterpret_cast<const void *>(&lambda)));
+ reinterpret_cast<void *>(&cb));
+ cb.rethrow();
return 0;
}
void unicode::bidi_logical_order(std::vector<unicode_bidi_level_t> &levels,
unicode_bidi_level_t paragraph_embedding,
- const std::function<void (size_t, size_t)
- noexcept> &lambda)
+ const std::function<void (size_t, size_t)>
+ &lambda)
{
if (levels.size() == 0)
return;
+ cb_wrapper<void (size_t, size_t)> cb{lambda};
unicode_bidi_logical_order(NULL, &levels[0], levels.size(),
paragraph_embedding,
&reorder_callback,
- const_cast<void *>
- (reinterpret_cast<const void *>(&lambda)));
+ reinterpret_cast<void *>(&cb));
+ cb.rethrow();
}
extern "C" {
@@ -769,10 +802,9 @@ extern "C" {
size_t n,
void *arg)
{
- auto p=reinterpret_cast<const std::function<void
- (const char32_t *,
- size_t n)
- noexcept> *>(arg);
+ auto p=reinterpret_cast<cb_wrapper<void
+ (const char32_t *,
+ size_t n)> *>(arg);
(*p)(string, n);
}
}
@@ -781,7 +813,7 @@ int unicode::bidi_embed(const std::u32string &string,
const std::vector<unicode_bidi_level_t> &levels,
unicode_bidi_level_t paragraph_embedding,
const std::function<void (const char32_t *string,
- size_t n) noexcept>
+ size_t n)>
&lambda)
{
if (string.size() != levels.size())
@@ -790,12 +822,13 @@ int unicode::bidi_embed(const std::u32string &string,
if (string.empty())
return 0;
+ cb_wrapper<void (const char32_t *, size_t)> cb{lambda};
unicode_bidi_embed(&string[0], &levels[0], string.size(),
paragraph_embedding,
embed_callback,
- const_cast<void *>
- (reinterpret_cast<const void *>
- (&lambda)));
+ reinterpret_cast<void *>(&cb));
+
+ cb.rethrow();
return 0;
}