summaryrefslogtreecommitdiffstats
path: root/unicode
diff options
context:
space:
mode:
authorSam Varshavchik2020-12-02 22:04:37 -0500
committerSam Varshavchik2020-12-02 22:04:37 -0500
commit4ec018fb1ea69a5eab159f090e0512856f471ccc (patch)
tree6b154ea28328037ce0fb532d80c35f9529cbf369 /unicode
parent5c8538b7b36081ffc6ca6ffef0885a5fc0459826 (diff)
downloadcourier-libs-4ec018fb1ea69a5eab159f090e0512856f471ccc.tar.bz2
unicode::bidi_reorder - add optional substring indices.
Diffstat (limited to 'unicode')
-rw-r--r--unicode/book.xml22
-rw-r--r--unicode/courier-unicode.h.in8
-rw-r--r--unicode/unicodecpp.C22
3 files changed, 43 insertions, 9 deletions
diff --git a/unicode/book.xml b/unicode/book.xml
index c0e0485..4838364 100644
--- a/unicode/book.xml
+++ b/unicode/book.xml
@@ -2835,13 +2835,17 @@ See COPYING for distribution information.
<funcdef>int <function>unicode::bidi_reorder</function></funcdef>
<paramdef>std::u32string &amp;<parameter>string</parameter></paramdef>
<paramdef>std::vector&lt;unicode_bidi_level_t&gt; &amp;<parameter>embedding_level</parameter></paramdef>
- <paramdef>const std::function&lt;void (size_t, size_t) noexcept&gt; &amp;<parameter>reorder_callback</parameter></paramdef>
+ <paramdef>const std::function&lt;void (size_t, size_t) noexcept&gt; &amp;<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>
<funcprototype>
<funcdef>void <function>unicode::bidi_reorder</function></funcdef>
<paramdef>std::vector&lt;unicode_bidi_level_t&gt; &amp;<parameter>embedding_level</parameter></paramdef>
- <paramdef>const std::function&lt;void (size_t, size_t) noexcept&gt; &amp;<parameter>reorder_callback</parameter></paramdef>
+ <paramdef>const std::function&lt;void (size_t, size_t) noexcept&gt; &amp;<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>
<funcprototype>
@@ -3012,6 +3016,20 @@ auto [levels, level]=unicode::bidi_calc(types);
an empty string in case of a mismatch.
</para>
</listitem>
+
+ <listitem>
+ <para>
+ <function>unicode::bidi_reorder</function>
+ reorders the entire <parameter>string</parameter> and its
+ <parameter>embedding_level</parameter>s by default.
+ The optional
+ <parameter>starting_pos</parameter> and
+ <parameter>n</parameter> parameters limit the reordering
+ to the indicated subset of the original string (specified
+ as the starting position offset index, and the number of
+ characters).
+ </para>
+ </listitem>
</itemizedlist>
<refsect2 id="unicode_cpp_bidi_literals">
diff --git a/unicode/courier-unicode.h.in b/unicode/courier-unicode.h.in
index a3a59f4..469b456 100644
--- a/unicode/courier-unicode.h.in
+++ b/unicode/courier-unicode.h.in
@@ -2234,12 +2234,16 @@ 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)>
- &reorder_callback=[](size_t, size_t){});
+ &reorder_callback=[](size_t, size_t){},
+ size_t starting_pos=0,
+ size_t n=(size_t)-1);
//! Dry-run reorder bidirectional text
void bidi_reorder(std::vector<unicode_bidi_level_t> &levels,
const std::function<void (size_t, size_t)>
- &reorder_callback=[](size_t, size_t){});
+ &reorder_callback=[](size_t, size_t){},
+ size_t starting_pos=0,
+ size_t n=(size_t)-1);
//! Remove directional markers
diff --git a/unicode/unicodecpp.C b/unicode/unicodecpp.C
index 48cc3c6..8c43b31 100644
--- a/unicode/unicodecpp.C
+++ b/unicode/unicodecpp.C
@@ -669,19 +669,23 @@ extern "C" {
int unicode::bidi_reorder(std::u32string &string,
std::vector<unicode_bidi_level_t> &levels,
- const std::function<void (size_t, size_t)> &lambda)
+ const std::function<void (size_t, size_t)> &lambda,
+ size_t pos,
+ size_t n)
{
size_t s=string.size();
if (s != levels.size())
return -1;
- if (!s)
+ if (pos >= s)
return 0;
+ if (n > s-pos)
+ n=s-pos;
cb_wrapper<void (size_t, size_t)> cb{lambda};
- unicode_bidi_reorder(&string[0], &levels[0], s,
+ unicode_bidi_reorder(&string[pos], &levels[pos], n,
reorder_callback,
reinterpret_cast<void *>(&cb));
@@ -690,16 +694,24 @@ int unicode::bidi_reorder(std::u32string &string,
}
void unicode::bidi_reorder(std::vector<unicode_bidi_level_t> &levels,
- const std::function<void (size_t, size_t)> &lambda)
+ const std::function<void (size_t, size_t)> &lambda,
+ size_t pos,
+ size_t n)
{
size_t s=levels.size();
if (!s)
return;
+ if (pos >= s)
+ return;
+
+ if (n > s-pos)
+ n=s-pos;
+
cb_wrapper<void (size_t, size_t)> cb{lambda};
- unicode_bidi_reorder(0, &levels[0], s, reorder_callback,
+ unicode_bidi_reorder(0, &levels[pos], n, reorder_callback,
reinterpret_cast<void *>(&cb));
cb.rethrow();