diff options
| -rw-r--r-- | unicode/biditest2.C | 2 | ||||
| -rw-r--r-- | unicode/courier-unicode.h.in | 30 | ||||
| -rw-r--r-- | unicode/unicode_bidi.c | 2 | ||||
| -rw-r--r-- | unicode/unicodecpp.C | 137 |
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; } |
