28 return (C ==
'+' || C ==
'-');
36 case 'E':
return true;
37 default:
return false;
43 case '0':
case '1':
case '2':
case '3':
case '4':
44 case '5':
case '6':
case '7':
case '8':
case '9':
45 case '.':
return true;
50 static const char *
BackupNumber(
const char *Pos,
const char *FirstChar) {
55 bool HasPeriod =
false;
82 const char *F1End,
const char *F2End,
83 double AbsTolerance,
double RelTolerance,
84 std::string *ErrorMsg) {
85 const char *F1NumEnd, *F2NumEnd;
86 double V1 = 0.0,
V2 = 0.0;
90 while (isspace(static_cast<unsigned char>(*F1P)) && F1P != F1End)
92 while (isspace(static_cast<unsigned char>(*F2P)) && F2P != F2End)
104 V1 =
strtod(F1P, const_cast<char**>(&F1NumEnd));
105 V2 =
strtod(F2P, const_cast<char**>(&F2NumEnd));
107 if (*F1NumEnd ==
'D' || *F1NumEnd ==
'd') {
111 StrTmp[
static_cast<unsigned>(F1NumEnd-F1P)] =
'e';
113 V1 =
strtod(&StrTmp[0], const_cast<char**>(&F1NumEnd));
114 F1NumEnd = F1P + (F1NumEnd-&StrTmp[0]);
117 if (*F2NumEnd ==
'D' || *F2NumEnd ==
'd') {
121 StrTmp[
static_cast<unsigned>(F2NumEnd-F2P)] =
'e';
123 V2 =
strtod(&StrTmp[0], const_cast<char**>(&F2NumEnd));
124 F2NumEnd = F2P + (F2NumEnd-&StrTmp[0]);
128 if (F1NumEnd == F1P || F2NumEnd == F2P) {
130 *ErrorMsg =
"FP Comparison failed, not a numeric difference between '";
132 *ErrorMsg +=
"' and '";
149 if (Diff > RelTolerance) {
152 <<
"Compared: " << V1 <<
" and " <<
V2 <<
'\n'
153 <<
"abs. diff = " <<
std::abs(V1-
V2) <<
" rel.diff = " << Diff <<
'\n'
154 <<
"Out of tolerance: rel/abs: " << RelTolerance <<
'/'
162 F1P = F1NumEnd; F2P = F2NumEnd;
176 double AbsTol,
double RelTol,
177 std::string *
Error) {
183 *Error = ec.message();
189 *Error = ec.message();
198 const char *F1P = File1Start;
199 const char *F2P = File2Start;
204 if (A_size == B_size &&
209 if (AbsTol == 0 && RelTol == 0) {
211 *Error =
"Files differ without tolerance allowance";
215 bool CompareFailed =
false;
218 while (F1P < File1End && F2P < File2End && *F1P == *F2P)
221 if (F1P >= File1End || F2P >= File2End)
break;
231 if (
CompareNumbers(F1P, F2P, File1End, File2End, AbsTol, RelTol, Error)) {
232 CompareFailed =
true;
239 bool F1AtEnd = F1P >= File1End;
240 bool F2AtEnd = F2P >= File2End;
241 if (!CompareFailed && (!F1AtEnd || !F2AtEnd)) {
250 if (
CompareNumbers(F1P, F2P, File1End, File2End, AbsTol, RelTol, Error))
251 CompareFailed =
true;
254 if (F1P < File1End || F2P < File2End)
255 CompareFailed =
true;
258 return CompareFailed;
const char * getBufferStart() const
static const char * BackupNumber(const char *Pos, const char *FirstChar)
double strtod(const char *nptr, char **endptr);
static const char * EndOfNumber(const char *Pos)
static bool CompareNumbers(const char *&F1P, const char *&F2P, const char *F1End, const char *F2End, double AbsTolerance, double RelTolerance, std::string *ErrorMsg)
CompareNumbers - compare two numbers, returning true if they are different.
int memcmp(const void *s1, const void *s2, size_t n);
static bool isNumberChar(char C)
static bool isSignedChar(char C)
static error_code getFile(Twine Filename, OwningPtr< MemoryBuffer > &result, int64_t FileSize=-1, bool RequiresNullTerminator=true)
size_t getBufferSize() const
const char * getBufferEnd() const
int DiffFilesWithTolerance(StringRef FileA, StringRef FileB, double AbsTol, double RelTol, std::string *Error=0)
static bool isExponentChar(char C)