- boost::uintmax_t const bytes = boost::filesystem::file_size (files[i]);
- boost::uintmax_t remaining = bytes;
-
- while (remaining > 0) {
- int const t = min (remaining, buffer_size);
- int const r = fread (buffer, 1, t, f);
- if (r != t) {
- throw ReadFileError (files[i], errno);
- }
- digester.add (buffer, t);
- remaining -= t;
-
- if (job) {
- job->set_progress ((float (i) + 1 - float(remaining) / bytes) / files.size ());
- }
+ boost::uintmax_t this_time = min (to_do, boost::filesystem::file_size (files[i]));
+ fread (p, 1, this_time, f);
+ p += this_time;
+ to_do -= this_time;
+ fclose (f);
+
+ ++i;
+ }
+ digester.add (buffer.get(), size - to_do);
+
+ /* Tail */
+ to_do = size;
+ p = buffer.get ();
+ i = files.size() - 1;
+ while (i >= 0 && to_do > 0) {
+ FILE* f = fopen_boost (files[i], "rb");
+ if (!f) {
+ throw OpenFileError (files[i].string());