diff options
Diffstat (limited to 'unicode')
| -rw-r--r-- | unicode/book.xml | 22 | ||||
| -rw-r--r-- | unicode/courier-unicode.h.in | 8 | ||||
| -rw-r--r-- | unicode/unicodecpp.C | 22 | 
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 &<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></paramdef> +	      <paramdef>const std::function<void (size_t, size_t) noexcept> &<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<unicode_bidi_level_t> &<parameter>embedding_level</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) noexcept> &<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(); | 
