summaryrefslogtreecommitdiffstats
path: root/unicode
diff options
context:
space:
mode:
authorSam Varshavchik2014-06-02 23:48:11 -0400
committerSam Varshavchik2014-06-02 23:48:11 -0400
commitb5c79832f0aad2e51f493854a24d34a513d77292 (patch)
tree31e3be5c17a9478415fa55bb8b3e2e156a5f5dbd /unicode
parent85fef2950d04d309555478ed3828cc0a01b28a09 (diff)
downloadcourier-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/ChangeLog16
-rw-r--r--unicode/book.xml14
-rw-r--r--unicode/linebreaktest.C29
-rw-r--r--unicode/unicode.h26
-rw-r--r--unicode/unicodecpp.C19
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 &amp;<parameter>charset</parameter></paramdef>
<paramdef>output_iter_t <parameter>output_iter</parameter></paramdef>
+ <paramdef>bool &amp;<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 &amp;<parameter>charset</parameter></paramdef>
<paramdef>std::string &amp;<parameter>out_buf</parameter></paramdef>
+ <paramdef>bool &amp;<parameter>errflag</parameter></paramdef>
</funcprototype>
<funcprototype>
- <funcdef>void <function>unicode::iconvert::fromu::convert</function></funcdef>
- <paramdef>const std::vector&lt;unicode_char&gt; &amp;<parameter>text</parameter></paramdef>
- <paramdef>const std::string &amp;<parameter>charset</parameter></paramdef>
- <paramdef>std::string &amp;<parameter>out_buf</parameter></paramdef>
- </funcprototype>
-
- <funcprototype>
- <funcdef>std::string <function>unicode::iconvert::fromu::convert</function></funcdef>
+ <funcdef>std::pair&lt;std::string, bool&gt; <function>unicode::iconvert::fromu::convert</function></funcdef>
<paramdef>const std::vector&lt;unicode_char&gt; &amp;<parameter>text</parameter></paramdef>
<paramdef>const std::string &amp;<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,