diff options
| author | Sam Varshavchik | 2014-06-02 23:48:11 -0400 | 
|---|---|---|
| committer | Sam Varshavchik | 2014-06-02 23:48:11 -0400 | 
| commit | b5c79832f0aad2e51f493854a24d34a513d77292 (patch) | |
| tree | 31e3be5c17a9478415fa55bb8b3e2e156a5f5dbd | |
| parent | 85fef2950d04d309555478ed3828cc0a01b28a09 (diff) | |
| download | courier-libs-b5c79832f0aad2e51f493854a24d34a513d77292.tar.bz2 | |
courier-unicode: unicode::iconvert::fromu::convert() change.
Return an error indication if unicode could not be converted to the
requested character set.
| -rw-r--r-- | unicode/ChangeLog | 16 | ||||
| -rw-r--r-- | unicode/book.xml | 14 | ||||
| -rw-r--r-- | unicode/linebreaktest.C | 29 | ||||
| -rw-r--r-- | unicode/unicode.h | 26 | ||||
| -rw-r--r-- | unicode/unicodecpp.C | 19 | 
5 files changed, 70 insertions, 34 deletions
| diff --git a/unicode/ChangeLog b/unicode/ChangeLog index a018e52..17ac321 100644 --- a/unicode/ChangeLog +++ b/unicode/ChangeLog @@ -1,3 +1,19 @@ +2014-06-02  Sam Varshavchik  <mrsam@courier-mta.com> + +	* unicode.h: Add convenience definitions for several standard character +	sets in the C++ unicode:: namespace. + +	* unicode.h: change iconvert::fromu::convert() to return an additional +	bool flag, an error indication. + +	* unicode.h: declare "deleted" when compiling at C++11 level, or higher, +	and fix some existing C++03-style private declaration stubs. + +	* unicode.h: fix pure virtual function call abort. + +	* linebreaktest.C (main): Make fromu::convert return an indication +	of a failed conversion. +  1.0  2014-01-06  Sam Varshavchik  <mrsam@courier-mta.com> diff --git a/unicode/book.xml b/unicode/book.xml index 006b082..738f8ca 100644 --- a/unicode/book.xml +++ b/unicode/book.xml @@ -1700,6 +1700,7 @@ extern const char unicode::iso_8859_1[];</funcsynopsisinfo>                <paramdef>input_iter_t <parameter>end_iter</parameter></paramdef>                <paramdef>const std::string &<parameter>charset</parameter></paramdef>                <paramdef>output_iter_t <parameter>output_iter</parameter></paramdef> +              <paramdef>bool &<parameter>errflag</parameter></paramdef>  	    </funcprototype>  	    <funcprototype> @@ -1708,17 +1709,11 @@ extern const char unicode::iso_8859_1[];</funcsynopsisinfo>                <paramdef>input_iter_t <parameter>end_iter</parameter></paramdef>                <paramdef>const std::string &<parameter>charset</parameter></paramdef>                <paramdef>std::string &<parameter>out_buf</parameter></paramdef> +              <paramdef>bool &<parameter>errflag</parameter></paramdef>  	    </funcprototype>  	    <funcprototype> -              <funcdef>void <function>unicode::iconvert::fromu::convert</function></funcdef> -              <paramdef>const std::vector<unicode_char> &<parameter>text</parameter></paramdef> -              <paramdef>const std::string &<parameter>charset</parameter></paramdef> -              <paramdef>std::string &<parameter>out_buf</parameter></paramdef> -	    </funcprototype> - -	    <funcprototype> -              <funcdef>std::string <function>unicode::iconvert::fromu::convert</function></funcdef> +              <funcdef>std::pair<std::string, bool> <function>unicode::iconvert::fromu::convert</function></funcdef>                <paramdef>const std::vector<unicode_char> &<parameter>text</parameter></paramdef>                <paramdef>const std::string &<parameter>charset</parameter></paramdef>  	    </funcprototype> @@ -1741,6 +1736,9 @@ extern const char unicode::iso_8859_1[];</funcsynopsisinfo>  	    character set.  	    <function>convert</function>() returns the value of the output  	    iterator after iterating over the converted character sequence. +	    <parameter>err_flag</parameter> gets set to <literal>true</literal> +	    if unicode text could not be converted to the requested character +	    set, or <literal>false</literal> for a successful conversion.  	  </para>  	  <para> diff --git a/unicode/linebreaktest.C b/unicode/linebreaktest.C index 0d1dffe..abaa922 100644 --- a/unicode/linebreaktest.C +++ b/unicode/linebreaktest.C @@ -202,13 +202,38 @@ int main(int argc, char **argv)  		exit(1);  	} -	if (unicode::iconvert::fromu::convert(uc.first, "utf-8") != convteststr) +	std::pair<std::string, bool> +		ret=unicode::iconvert::fromu::convert(uc.first, "utf-8"); + +	if (ret.first != convteststr || ret.second) +	{ +		std::cerr << "unicode::iconvert::fromu::convert failed (1)" +			  << std::endl; +		exit(1); +	} + +	uc.first.clear(); +	uc.first.push_back(0x30A2); + +	if (!unicode::iconvert::fromu::convert(uc.first, "iso-8859-1") +	    .second)  	{ -		std::cerr << "unicode::iconvert::fromu::convert failed" +		std::cerr << "unicode::iconvert::fromu::convert failed (2)"  			  << std::endl;  		exit(1);  	} +	uc.first[0]=160; + +	if (unicode::iconvert::fromu::convert(uc.first, "iso-8859-1") +	    .second) +	{ +		std::cerr << "unicode::iconvert::fromu::convert failed (3)" +			  << std::endl; +		exit(1); +	} + +  	uc=unicode::iconvert::tou::convert("\xE3", "utf-8");  	if (!uc.second) diff --git a/unicode/unicode.h b/unicode/unicode.h index bfe1256..e3a68a9 100644 --- a/unicode/unicode.h +++ b/unicode/unicode.h @@ -1167,28 +1167,27 @@ namespace unicode {  			static output_iter_t convert(input_iter_t from_iter,  						     input_iter_t to_iter,  						     const std::string &chset, -						     output_iter_t out_iter); +						     output_iter_t out_iter, +						     bool &errflag);  		template<typename input_iter_t>  			static void convert(input_iter_t from_iter,  					    input_iter_t to_iter,  					    const std::string &chset, -					    std::string &out_buf) +					    std::string &out_buf, +					    bool &errflag)  		{  			out_buf="";  			std::back_insert_iterator<std::string>  				insert_iter(out_buf); -			convert(from_iter, to_iter, chset, insert_iter); +			convert(from_iter, to_iter, chset, insert_iter, +				errflag);  		} -		static void convert(const std::vector<unicode_char> &ubuf, -				    const std::string &chset, -				    std::string &out_buf); - -		static std::string convert(const std::vector<unicode_char> -					   &ubuf, -					   const std::string &chset); +		static std::pair<std::string, bool> +			convert(const std::vector<unicode_char> &ubuf, +				const std::string &chset);  	};  	/* Helper class that saves unicode output into an output iterator */ @@ -1226,8 +1225,11 @@ namespace unicode {  		output_iter_t iconvert::fromu::convert(input_iter_t from_iter,  						       input_iter_t to_iter,  						       const std::string &chset, -						       output_iter_t out_iter) +						       output_iter_t out_iter, +						       bool &errflag)  		{ +			errflag=true; +  			class to_iter_class<output_iter_t> out(out_iter);  			if (!out.begin(chset)) @@ -1249,7 +1251,7 @@ namespace unicode {  			if (string.size() > 0)  				out(&string[0], string.size()); -			out.end(); +			out.end(errflag);  			return out;  		} diff --git a/unicode/unicodecpp.C b/unicode/unicodecpp.C index cbe8f56..0ba4674 100644 --- a/unicode/unicodecpp.C +++ b/unicode/unicodecpp.C @@ -249,21 +249,16 @@ bool unicode::iconvert::fromu::begin(const std::string &chset)  	return iconvert::begin(unicode_u_ucs4_native, chset);  } -std::string unicode::iconvert::fromu::convert(const std::vector<unicode_char> -					   &ubuf, -					   const std::string &chset) +std::pair<std::string, bool> +unicode::iconvert::fromu::convert(const std::vector<unicode_char> &ubuf, +				  const std::string &chset)  { -	std::string s; +	std::pair<std::string, bool> ret; -	convert(ubuf, chset, s); -	return s; -} +	convert(ubuf.begin(), ubuf.end(), chset, +		ret.first, ret.second); -void unicode::iconvert::fromu::convert(const std::vector<unicode_char> &ubuf, -				    const std::string &chset, -				    std::string &out_buf) -{ -	convert(ubuf.begin(), ubuf.end(), chset, out_buf); +	return ret;  }  std::string unicode::iconvert::convert_tocase(const std::string &text, | 
