diff options
| author | Sam Varshavchik | 2020-10-27 21:23:38 -0400 | 
|---|---|---|
| committer | Sam Varshavchik | 2020-10-27 21:23:38 -0400 | 
| commit | 808b55c10de704bfbb55f6e03e266c5383bb586a (patch) | |
| tree | 77ab72053b6ce43fef5f2c0580b7a5b2570d3ba2 /unicode | |
| parent | 9db205e80a937095c2993022a81dd73c622ea2a4 (diff) | |
| download | courier-libs-808b55c10de704bfbb55f6e03e266c5383bb586a.tar.bz2 | |
gcc fixes.
Diffstat (limited to 'unicode')
| -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;  }  | 
