#include "llvm/System/Path.h"
#include "llvm/System/MappedFile.h"
#include "llvm/ADT/StringExtras.h"
-#include <cmath>
#include <cstring>
#include <cctype>
using namespace llvm;
}
if (F1NumEnd == F1P || F2NumEnd == F2P) {
- if (ErrorMsg) *ErrorMsg = "Comparison failed, not a numeric difference.";
+ if (ErrorMsg) {
+ *ErrorMsg = "FP Comparison failed, not a numeric difference between '";
+ *ErrorMsg += F1P[0];
+ *ErrorMsg += "' and '";
+ *ErrorMsg += F2P[0];
+ *ErrorMsg += "'";
+ }
return true;
}
Diff = 0; // Both zero.
if (Diff > RelTolerance) {
if (ErrorMsg) {
- *ErrorMsg = "Compared: " + ftostr(V1) + " and " + ftostr(V2) +
- ": diff = " + ftostr(Diff) + "\n";
+ *ErrorMsg = "Compared: " + ftostr(V1) + " and " + ftostr(V2) + "\n";
+ *ErrorMsg += "abs. diff = " + ftostr(std::abs(V1-V2)) +
+ " rel.diff = " + ftostr(Diff) + "\n";
*ErrorMsg += "Out of tolerance: rel/abs: " + ftostr(RelTolerance) +
"/" + ftostr(AbsTolerance);
}
/// error occurs, allowing the caller to distinguish between a failed diff and a
/// file system error.
///
-int llvm::DiffFilesWithTolerance(const sys::Path &FileA,
- const sys::Path &FileB,
+int llvm::DiffFilesWithTolerance(const sys::PathWithStatus &FileA,
+ const sys::PathWithStatus &FileB,
double AbsTol, double RelTol,
std::string *Error) {
- sys::FileStatus FileAStat, FileBStat;
- if (FileA.getFileStatus(FileAStat, Error))
+ const sys::FileStatus *FileAStat = FileA.getFileStatus(false, Error);
+ if (!FileAStat)
return 2;
- if (FileB.getFileStatus(FileBStat, Error))
+ const sys::FileStatus *FileBStat = FileB.getFileStatus(false, Error);
+ if (!FileBStat)
return 2;
// Check for zero length files because some systems croak when you try to
// mmap an empty file.
- size_t A_size = FileAStat.getSize();
- size_t B_size = FileBStat.getSize();
+ size_t A_size = FileAStat->getSize();
+ size_t B_size = FileBStat->getSize();
// If they are both zero sized then they're the same
if (A_size == 0 && B_size == 0)
return 0;
+
// If only one of them is zero sized then they can't be the same
- if ((A_size == 0 || B_size == 0))
+ if ((A_size == 0 || B_size == 0)) {
+ if (Error)
+ *Error = "Files differ: one is zero-sized, the other isn't";
return 1;
+ }
// Now its safe to mmap the files into memory becasue both files
// have a non-zero size.
if (std::memcmp(File1Start, File2Start, A_size) == 0)
return 0;
- if (AbsTol == 0 && RelTol == 0)
+ if (AbsTol == 0 && RelTol == 0) {
+ if (Error)
+ *Error = "Files differ without tolerance allowance";
return 1; // Files different!
+ }
}
char *OrigFile1Start = File1Start;