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 /unicode | |
| 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.
Diffstat (limited to 'unicode')
| -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, |
