Adjust DiffFilesWithTolerance to help poor cygwin's mmap facility by
authorReid Spencer <rspencer@reidspencer.com>
Tue, 15 Feb 2005 21:47:02 +0000 (21:47 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Tue, 15 Feb 2005 21:47:02 +0000 (21:47 +0000)
handling zero length files a little more intelligently. If both files are
zero length then we return 0 (true) indicating a match. If only one of the
files is zero length then we return 1 (false) indicating that the files
differ. If the files don't agree in length then they can't match so we
skip the first loop that looks for a quick match.

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

lib/Support/FileUtilities.cpp

index 99db439d327a2717b4ca0566e26beb86510f0390..f8191c51210fb3dd26807b0722c85b71b63f4ee9 100644 (file)
@@ -119,7 +119,20 @@ int llvm::DiffFilesWithTolerance(const sys::Path &FileA,
                                  double AbsTol, double RelTol,
                                  std::string *Error) {
   try {
-    // Map in the files into memory.
+    // Check for zero length files becasue some systems croak when you try to
+    // mmap an empty file.
+    size_t A_size = FileA.getSize();
+    size_t B_size = FileB.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))
+      return 1;
+
+    // Now its safe to mmap the files into memory becasue both files
+    // have a non-zero size. 
     sys::MappedFile F1(FileA);
     sys::MappedFile F2(FileB);
     F1.map();
@@ -133,15 +146,18 @@ int llvm::DiffFilesWithTolerance(const sys::Path &FileA,
     char *F1P = File1Start;
     char *F2P = File2Start;
 
-    // Scan for the end of file or first difference.
-    while (F1P < File1End && F2P < File2End && *F1P == *F2P)
-      ++F1P, ++F2P;
+    if (A_size == B_size) {
+      // Scan for the end of file or first difference.
+      while (F1P < File1End && F2P < File2End && *F1P == *F2P)
+        ++F1P, ++F2P;
 
-    // Common case: identifical files.
-    if (F1P == File1End && F2P == File2End) return 0;
+      // Common case: identifical files.
+      if (F1P == File1End && F2P == File2End) 
+        return 0; // Scanned to end, files same
 
-    if (AbsTol == 0 && RelTol == 0)
-      return 1;   // Files different!
+      if (AbsTol == 0 && RelTol == 0)
+        return 1;   // Files different!
+    }
 
     char *OrigFile1Start = File1Start;
     char *OrigFile2Start = File2Start;