summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/FileUtilities.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2005-02-15 21:47:02 +0000
committerReid Spencer <rspencer@reidspencer.com>2005-02-15 21:47:02 +0000
commitf4425b0208713d93c39b87b224f7d20a5ffb7a35 (patch)
treefa84e14ec511ec861b78f1ea060800f135839732 /llvm/lib/Support/FileUtilities.cpp
parent5f7c53599e0be4fc7aa6fcc9422b243d412df66f (diff)
downloadbcm5719-llvm-f4425b0208713d93c39b87b224f7d20a5ffb7a35.tar.gz
bcm5719-llvm-f4425b0208713d93c39b87b224f7d20a5ffb7a35.zip
Adjust DiffFilesWithTolerance to help poor cygwin's mmap facility by
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. llvm-svn: 20200
Diffstat (limited to 'llvm/lib/Support/FileUtilities.cpp')
-rw-r--r--llvm/lib/Support/FileUtilities.cpp32
1 files changed, 24 insertions, 8 deletions
diff --git a/llvm/lib/Support/FileUtilities.cpp b/llvm/lib/Support/FileUtilities.cpp
index 99db439d327..f8191c51210 100644
--- a/llvm/lib/Support/FileUtilities.cpp
+++ b/llvm/lib/Support/FileUtilities.cpp
@@ -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;
OpenPOWER on IntegriCloud