diff options
| author | Sam Varshavchik | 2020-12-06 23:17:15 -0500 |
|---|---|---|
| committer | Sam Varshavchik | 2020-12-06 23:17:15 -0500 |
| commit | e0323de90c1db71e364abc0a493f19585377d7ed (patch) | |
| tree | 2c626c4b50e37975ac4f6117574dd7718bb69411 /unicode | |
| parent | a5cc76216e08481a6f3614574a8ee498e5800afa (diff) | |
| download | courier-libs-e0323de90c1db71e364abc0a493f19585377d7ed.tar.bz2 | |
courier-unicode: add original string flag to bidi_embed callback.
Diffstat (limited to 'unicode')
| -rw-r--r-- | unicode/biditest2.C | 37 | ||||
| -rw-r--r-- | unicode/book.xml | 26 | ||||
| -rw-r--r-- | unicode/courier-unicode.h.in | 4 | ||||
| -rw-r--r-- | unicode/unicode_bidi.c | 22 | ||||
| -rw-r--r-- | unicode/unicodecpp.C | 14 |
5 files changed, 76 insertions, 27 deletions
diff --git a/unicode/biditest2.C b/unicode/biditest2.C index ce293b6..0e0472e 100644 --- a/unicode/biditest2.C +++ b/unicode/biditest2.C @@ -355,9 +355,40 @@ void character_test() 0, logical_string.size()); - auto new_string=unicode::bidi_embed(logical_string, - logical_levels, - paragraph); + std::u32string new_string; + + unicode::bidi_embed + (logical_string, + logical_levels, + paragraph, + [&] + (const char32_t *string, + size_t n, + bool is_part_of_string) + { + if ((std::less_equal<const char32_t *> + {}(logical_string.c_str(), + string) && + std::less<const + char32_t *> + {}(string, + logical_string.c_str() + +logical_string.size())) + != is_part_of_string) + { + std::cerr << + "bidi_embed passed in " + "wrong value for " + "is_part_of_string" + << std::endl; + exit(1); + } + + new_string.insert + (new_string.end(), + string, + string+n); + }); auto save_string=new_string; diff --git a/unicode/book.xml b/unicode/book.xml index 3eb0a6e..0275058 100644 --- a/unicode/book.xml +++ b/unicode/book.xml @@ -381,7 +381,7 @@ See COPYING for distribution information. <paramdef>const unicode_bidi_level_t *<parameter>levels</parameter></paramdef> <paramdef>size_t <parameter>n</parameter></paramdef> <paramdef>unicode_bidi_level_t <parameter>paragraph_embedding</parameter></paramdef> - <paramdef>void (*<parameter>emit</parameter>)(const char32_t *string, size_t n, void *arg)</paramdef> + <paramdef>void (*<parameter>emit</parameter>)(const char32_t *string, size_t n, int is_part_of_string, void *arg)</paramdef> <paramdef>void *<parameter>arg</parameter></paramdef> </funcprototype> @@ -942,6 +942,14 @@ See COPYING for distribution information. </listitem> <listitem> <para> + Indication whether the Unicode string pointer is pointing + to a part of the original Unicode string that's getting + embedded. Otherwise this must be some marker character that's + not present in the original Unicode string. + </para> + </listitem> + <listitem> + <para> Forwarded <parameter>arg</parameter> pointer value. </para> </listitem> @@ -2835,7 +2843,7 @@ See COPYING for distribution information. <funcdef>int <function>unicode::bidi_reorder</function></funcdef> <paramdef>std::u32string &<parameter>string</parameter></paramdef> <paramdef>std::vector<unicode_bidi_level_t> &<parameter>embedding_level</parameter></paramdef> - <paramdef>const std::function<void (size_t, size_t) noexcept> &<parameter>reorder_callback</parameter>=[](size_t, size_t){}</paramdef> + <paramdef>const std::function<void (size_t, size_t)> &<parameter>reorder_callback</parameter>=[](size_t, size_t){}</paramdef> <paramdef>size_t <parameter>starting_pos</parameter>=0</paramdef> <paramdef>size_t <parameter>n</parameter>=(size_t)-1</paramdef> </funcprototype> @@ -2843,7 +2851,7 @@ See COPYING for distribution information. <funcprototype> <funcdef>void <function>unicode::bidi_reorder</function></funcdef> <paramdef>std::vector<unicode_bidi_level_t> &<parameter>embedding_level</parameter></paramdef> - <paramdef>const std::function<void (size_t, size_t) noexcept> &<parameter>reorder_callback</parameter>=[](size_t, size_t){}</paramdef> + <paramdef>const std::function<void (size_t, size_t)> &<parameter>reorder_callback</parameter>=[](size_t, size_t){}</paramdef> <paramdef>size_t <parameter>starting_pos</parameter>=0</paramdef> <paramdef>size_t <parameter>n</parameter>=(size_t)-1</paramdef> </funcprototype> @@ -2851,7 +2859,7 @@ See COPYING for distribution information. <funcprototype> <funcdef>void <function>unicode::bidi_cleanup</function></funcdef> <paramdef>std::u32string &<parameter>string</parameter></paramdef> - <paramdef>const std::function<void (size_t) noexcept> &<parameter>removed_callback</parameter>=[](size_t){}</paramdef> + <paramdef>const std::function<void (size_t)> &<parameter>removed_callback</parameter>=[](size_t){}</paramdef> <paramdef>int <parameter>cleanup_options</parameter></paramdef> </funcprototype> @@ -2859,7 +2867,7 @@ See COPYING for distribution information. <funcdef>int <function>unicode::bidi_cleanup</function></funcdef> <paramdef>std::u32string &<parameter>string</parameter></paramdef> <paramdef>std::vector <unicode_bidi_level_t> &<parameter>levels</parameter></paramdef> - <paramdef>const std::function<void (size_t) noexcept> &<parameter>removed_callback</parameter>=[](size_t){}</paramdef> + <paramdef>const std::function<void (size_t)> &<parameter>removed_callback</parameter>=[](size_t){}</paramdef> <paramdef>int <parameter>cleanup_options</parameter>=0</paramdef> </funcprototype> @@ -2867,7 +2875,7 @@ See COPYING for distribution information. <funcdef>int <function>unicode::bidi_cleanup</function></funcdef> <paramdef>std::u32string &<parameter>string</parameter></paramdef> <paramdef>std::vector <unicode_bidi_level_t> &<parameter>levels</parameter></paramdef> - <paramdef>const std::function<void (size_t) noexcept> &<parameter>removed_callback</parameter></paramdef> + <paramdef>const std::function<void (size_t)> &<parameter>removed_callback</parameter></paramdef> <paramdef>int <parameter>cleanup_options</parameter></paramdef> <paramdef>size_t <parameter>starting_pos</parameter></paramdef> <paramdef>size_t <parameter>n</parameter></paramdef> @@ -2878,7 +2886,7 @@ See COPYING for distribution information. <paramdef>std::u32string &<parameter>string</parameter></paramdef> <paramdef>std::vector <unicode_bidi_level_t> &<parameter>levels</parameter></paramdef> <paramdef>unicode_bidi_level_t <parameter>paragraph_embedding</parameter></paramdef> - <paramdef>const std::function<void (size_t, size_t) noexcept> &<parameter>reorder_callback</parameter>=[](size_t, size_t){}</paramdef> + <paramdef>const std::function<void (size_t, size_t)> &<parameter>reorder_callback</parameter>=[](size_t, size_t){}</paramdef> <paramdef>size_t <parameter>starting_pos</parameter>=0</paramdef> <paramdef>size_t <parameter>n</parameter>=(size_t)-1</paramdef> </funcprototype> @@ -2887,7 +2895,7 @@ See COPYING for distribution information. <funcdef>void <function>unicode::bidi_logical_order</function></funcdef> <paramdef>std::vector <unicode_bidi_level_t> &<parameter>levels</parameter></paramdef> <paramdef>unicode_bidi_level_t <parameter>paragraph_embedding</parameter></paramdef> - <paramdef>const std::function<void (size_t, size_t) noexcept> &<parameter>reorder_callback</parameter></paramdef> + <paramdef>const std::function<void (size_t, size_t)> &<parameter>reorder_callback</parameter></paramdef> <paramdef>size_t <parameter>starting_pos</parameter>=0</paramdef> <paramdef>size_t <parameter>n</parameter>=(size_t)-1</paramdef> </funcprototype> @@ -2897,7 +2905,7 @@ See COPYING for distribution information. <paramdef>const std::u32string &<parameter>string</parameter></paramdef> <paramdef>const std::vector <unicode_bidi_level_t> &<parameter>levels</parameter></paramdef> <paramdef>unicode_bidi_level_t <parameter>paragraph_embedding</parameter></paramdef> - <paramdef>const std::function<void (size_t, const char32_t *, size_t) noexcept> &<parameter>callback</parameter></paramdef> + <paramdef>const std::function<void (const char32_t *, size_t, bool)> &<parameter>callback</parameter></paramdef> </funcprototype> <funcprototype> diff --git a/unicode/courier-unicode.h.in b/unicode/courier-unicode.h.in index 9d398ec..1c7245c 100644 --- a/unicode/courier-unicode.h.in +++ b/unicode/courier-unicode.h.in @@ -698,6 +698,7 @@ extern void unicode_bidi_embed(const char32_t *string, unicode_bidi_level_t paragraph_embedding, void (*emit)(const char32_t *string, size_t n, + int, void *arg), void *arg); @@ -2313,7 +2314,8 @@ 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)> &lambda); + size_t n, + bool is_part_of_string)> &lambda); //! Embed directional and isolation markers diff --git a/unicode/unicode_bidi.c b/unicode/unicode_bidi.c index 92fe8a7..73440ed 100644 --- a/unicode/unicode_bidi.c +++ b/unicode/unicode_bidi.c @@ -2215,6 +2215,7 @@ static void emit_bidi_embed_levelrun(const char32_t *string, struct need_marker_info *need_marker, void (*emit)(const char32_t *string, size_t n, + int is_part_of_string, void *arg), void *arg); @@ -2250,18 +2251,19 @@ static void emit_marker(struct bidi_embed_levelrun *p, struct need_marker_info *info, void (*emit)(const char32_t *string, size_t n, + int is_part_of_string, void *arg), void *arg) { char32_t marker= (p->level & 1) ? UNICODE_RLM:UNICODE_LRM; if (info->need_marker) - (*emit)(&marker, 1, arg); + (*emit)(&marker, 1, 0, arg); if (info->need_pdi) { marker=UNICODE_PDI; - (*emit)(&marker, 1, arg); + (*emit)(&marker, 1, 0, arg); } } @@ -2271,6 +2273,7 @@ void unicode_bidi_embed(const char32_t *string, unicode_bidi_level_t paragraph_level, void (*emit)(const char32_t *string, size_t n, + int is_part_of_string, void *arg), void *arg) { @@ -2404,7 +2407,7 @@ void unicode_bidi_embed(const char32_t *string, previous_level=paragraph_level; - (*emit)(string+p->end, 1, arg); + (*emit)(string+p->end, 1, 1, arg); continue; } @@ -2506,6 +2509,7 @@ static void emit_bidi_embed_levelrun(const char32_t *string, struct need_marker_info *need_marker, void (*emit)(const char32_t *string, size_t n, + int is_part_of_string, void *arg), void *arg) { @@ -2561,7 +2565,7 @@ static void emit_bidi_embed_levelrun(const char32_t *string, char32_t override_start=run->level ? UNICODE_RLI:UNICODE_LRI; if (run->level != paragraph_level) - (*emit)(&override_start, 1, arg); + (*emit)(&override_start, 1, 0, arg); /* ** Make sure the character sequence has strong context. @@ -2637,9 +2641,9 @@ static void emit_bidi_embed_levelrun(const char32_t *string, */ if (word_start > start) (*emit)(string+start, - word_start-start, arg); + word_start-start, 1, arg); - (*emit)(&override_start, 1, arg); + (*emit)(&override_start, 1, 0, arg); while (++i < end) { enum_bidi_type_t t=types[i]; @@ -2657,12 +2661,12 @@ static void emit_bidi_embed_levelrun(const char32_t *string, fprintf(DEBUGDUMP, "end of word at %d\n", (int)i); #endif - (*emit)(string+word_start, i-word_start, arg); - (*emit)(&override_end, 1, arg); + (*emit)(string+word_start, i-word_start, 1, arg); + (*emit)(&override_end, 1, 0, arg); start=i; continue; } - (*emit)(string+start, i-start, arg); + (*emit)(string+start, i-start, 1, arg); start=i; } diff --git a/unicode/unicodecpp.C b/unicode/unicodecpp.C index 3ef3b05..10156a4 100644 --- a/unicode/unicodecpp.C +++ b/unicode/unicodecpp.C @@ -857,12 +857,14 @@ void unicode::bidi_logical_order(std::vector<unicode_bidi_level_t> &levels, extern "C" { static void embed_callback(const char32_t *string, size_t n, + int is_part_of_string, void *arg) { auto p=reinterpret_cast<cb_wrapper<void (const char32_t *, - size_t n)> *>(arg); - (*p)(string, n); + size_t n, + bool)> *>(arg); + (*p)(string, n, is_part_of_string != 0); } } @@ -870,7 +872,8 @@ 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)> + size_t n, + bool is_part_of_string)> &lambda) { if (string.size() != levels.size()) @@ -879,7 +882,7 @@ int unicode::bidi_embed(const std::u32string &string, if (string.empty()) return 0; - cb_wrapper<void (const char32_t *, size_t)> cb{lambda}; + cb_wrapper<void (const char32_t *, size_t, bool)> cb{lambda}; unicode_bidi_embed(&string[0], &levels[0], string.size(), paragraph_embedding, embed_callback, @@ -899,7 +902,8 @@ std::u32string unicode::bidi_embed(const std::u32string &string, (void)bidi_embed(string, levels, paragraph_embedding, [&] (const char32_t *string, - size_t n) + size_t n, + bool ignored) { new_string.insert(new_string.end(), string, string+n); |
