From 045624abd72d81b7440e023f6c3754f7689d4005 Mon Sep 17 00:00:00 2001 From: ntrifunovic Date: Tue, 15 Feb 2011 01:18:49 +0000 Subject: [PATCH] Fix for [3167987]: prior moves it before start git-svn-id: http://svn.code.sf.net/p/utfcpp/code@116 a809a056-fc17-0410-9590-b4f493f8b08e --- source/utf8/checked.h | 14 +++++++++----- test_drivers/negative/negative.cpp | 26 +++++++++++++------------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/source/utf8/checked.h b/source/utf8/checked.h index a1d2035..9cb8d2c 100644 --- a/source/utf8/checked.h +++ b/source/utf8/checked.h @@ -161,13 +161,17 @@ namespace utf8 template uint32_t prior(octet_iterator& it, octet_iterator start) - { - octet_iterator end = it; + { + // can't do much if it == start + if (it == start) + throw not_enough_room(); + + octet_iterator end = it; + // Go back until we hit either a lead octet or start while (internal::is_trail(*(--it))) - if (it < start) + if (it == start) throw invalid_utf8(*it); // error - no lead byte in the sequence - octet_iterator temp = it; - return next(temp, end); + return peek_next(it, end); } /// Deprecated in versions that include "prior" diff --git a/test_drivers/negative/negative.cpp b/test_drivers/negative/negative.cpp index ee28257..0497945 100644 --- a/test_drivers/negative/negative.cpp +++ b/test_drivers/negative/negative.cpp @@ -22,8 +22,8 @@ int main(int argc, char** argv) // Open the test file ifstream fs8(test_file_path.c_str()); if (!fs8.is_open()) { - cout << "Could not open " << test_file_path << endl; - return 0; + cout << "Could not open " << test_file_path << endl; + return 0; } // Read it line by line @@ -32,20 +32,20 @@ int main(int argc, char** argv) while (!fs8.eof()) { string line; while ((byte = static_cast(fs8.get())) != '\n' && !fs8.eof()) - line.push_back(byte); + line.push_back(byte); line_count++; - // Print out lines that contain invalid UTF-8 - if (!is_valid(line.begin(), line.end())) { - const unsigned* u = find(INVALID_LINES, INVALID_LINES_END, line_count); - if (u == INVALID_LINES_END) - cout << "Unexpected invalid utf-8 at line " << line_count << '\n'; + // Print out lines that contain invalid UTF-8 + if (!is_valid(line.begin(), line.end())) { + const unsigned* u = find(INVALID_LINES, INVALID_LINES_END, line_count); + if (u == INVALID_LINES_END) + cout << "Unexpected invalid utf-8 at line " << line_count << '\n'; - // try fixing it: - string fixed_line; - replace_invalid(line.begin(), line.end(), back_inserter(fixed_line)); - if (!is_valid(fixed_line.begin(), fixed_line.end())) - cout << "replace_invalid() resulted in an invalid utf-8 at line " << line_count << '\n'; + // try fixing it: + string fixed_line; + replace_invalid(line.begin(), line.end(), back_inserter(fixed_line)); + if (!is_valid(fixed_line.begin(), fixed_line.end())) + cout << "replace_invalid() resulted in an invalid utf-8 at line " << line_count << '\n'; } } }