+
+void
+check_file (boost::filesystem::path ref, boost::filesystem::path check)
+{
+ uintmax_t N = boost::filesystem::file_size (ref);
+ BOOST_CHECK_EQUAL (N, boost::filesystem::file_size (check));
+ FILE* ref_file = fopen (ref.string().c_str(), "rb");
+ BOOST_CHECK (ref_file);
+ FILE* check_file = fopen (check.string().c_str(), "rb");
+ BOOST_CHECK (check_file);
+
+ int const buffer_size = 65536;
+ uint8_t* ref_buffer = new uint8_t[buffer_size];
+ uint8_t* check_buffer = new uint8_t[buffer_size];
+
+ uintmax_t offset = 0;
+ while (offset < N) {
+ uintmax_t this_time = min (uintmax_t (buffer_size), N - offset);
+ size_t r = fread (ref_buffer, 1, this_time, ref_file);
+ BOOST_CHECK_EQUAL (r, this_time);
+ r = fread (check_buffer, 1, this_time, check_file);
+ BOOST_CHECK_EQUAL (r, this_time);
+
+ for (uintmax_t i = 0; i < this_time; ++i) {
+ string const s = String::compose (
+ "Files differ at offset %1; reference is %2, check is %3", (offset + i), ((int) ref_buffer[i]), ((int) check_buffer[i])
+ );
+ BOOST_CHECK_MESSAGE (ref_buffer[i] == check_buffer[i], s);
+ }
+
+ offset += this_time;
+ }
+
+ delete[] ref_buffer;
+ delete[] check_buffer;
+
+ fclose (ref_file);
+ fclose (check_file);
+}