Fix the really bizarre stuff that happened last night in the tester
authorChris Lattner <sabre@nondot.org>
Wed, 9 Jun 2004 18:28:53 +0000 (18:28 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 9 Jun 2004 18:28:53 +0000 (18:28 +0000)
due to non-numeric diff failures that caused fpcmp to go into infinite loops

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14098 91177308-0d34-0410-b5e6-96231b3b80d8

utils/fpcmp/fpcmp.cpp

index ac0e10cd74032b1c9e5a201c8aec648d3e8e1d87..c3cdd29047948864359abfec97c5003746cf8061 100644 (file)
@@ -54,6 +54,10 @@ static bool isNumberChar(char C) {
 }
 
 static char *BackupNumber(char *Pos, char *FirstChar) {
+  // If we didn't stop in the middle of a number, don't backup.
+  if (!isNumberChar(*Pos)) return Pos;
+
+  // Otherwise, return to the start of the number.
   while (Pos > FirstChar && isNumberChar(Pos[-1]))
     --Pos;
   return Pos;
@@ -61,8 +65,16 @@ static char *BackupNumber(char *Pos, char *FirstChar) {
 
 static void CompareNumbers(char *&F1P, char *&F2P, char *F1End, char *F2End) {
   char *F1NumEnd, *F2NumEnd;
-  double V1 = strtod(F1P, &F1NumEnd);
-  double V2 = strtod(F2P, &F2NumEnd);
+  double V1, V2; 
+  // If we stop on numbers, compare their difference.
+  if (isNumberChar(*F1P) && isNumberChar(*F2P)) {
+    V1 = strtod(F1P, &F1NumEnd);
+    V2 = strtod(F2P, &F2NumEnd);
+  } else {
+    // Otherwise, the diff failed.
+    F1NumEnd = F1P;
+    F2NumEnd = F2P;
+  }
 
   if (F1NumEnd == F1P || F2NumEnd == F2P) {
     std::cerr << "Comparison failed, not a numeric difference.\n";