Fix up the ocaml kaleidoscope example as well.
[oota-llvm.git] / include / llvm / Support / FileUtilities.h
index 86d82a14fd97c90b96a59f537407285cc8f11ceb..d0dd4a7598888863c4e12e8e43e41e834ac60559 100644 (file)
@@ -1,10 +1,10 @@
 //===- llvm/Support/FileUtilities.h - File System Utilities -----*- C++ -*-===//
-// 
+//
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
-// 
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
 //===----------------------------------------------------------------------===//
 //
 // This file defines a family of utility functions which are useful for doing
 
 namespace llvm {
 
-/// DiffFiles - Compare the two files specified, returning true if they are
-/// different or if there is a file error.  If you specify a string to fill in
-/// for the error option, it will set the string to an error message if an error
-/// occurs, allowing the caller to distinguish between a failed diff and a file
-/// system error.
-///
-bool DiffFiles(const std::string &FileA, const std::string &FileB,
-               std::string *Error = 0);
-
-/// DiffFilesWithTolerance - Compare the two files specified, returning 0 if the
-/// files match, 1 if they are different, and 2 if there is a file error.  This
-/// function differs from DiffFiles in that you can specify an absolete and
-/// relative FP error that is allowed to exist.  If you specify a string to fill
-/// in for the error option, it will set the string to an error message if an
-/// error occurs, allowing the caller to distinguish between a failed diff and a
-/// file system error.
-///
-int DiffFilesWithTolerance(const std::string &FileA, const std::string &FileB,
-                           double AbsTol, double RelTol,
-                           std::string *Error = 0);
+  /// DiffFilesWithTolerance - Compare the two files specified, returning 0 if
+  /// the files match, 1 if they are different, and 2 if there is a file error.
+  /// This function allows you to specify an absolete and relative FP error that
+  /// is allowed to exist.  If you specify a string to fill in for the error
+  /// option, it will set the string to an error message if an error occurs, or
+  /// if the files are different.
+  ///
+  int DiffFilesWithTolerance(const sys::PathWithStatus &FileA,
+                             const sys::PathWithStatus &FileB,
+                             double AbsTol, double RelTol,
+                             std::string *Error = 0);
 
 
-/// MoveFileOverIfUpdated - If the file specified by New is different than Old,
-/// or if Old does not exist, move the New file over the Old file.  Otherwise,
-/// remove the New file.
-///
-void MoveFileOverIfUpdated(const std::string &New, const std::string &Old);
   /// FileRemover - This class is a simple object meant to be stack allocated.
   /// If an exception is thrown from a region, the object removes the filename
   /// specified (if deleteIt is true).
@@ -55,14 +40,27 @@ void MoveFileOverIfUpdated(const std::string &New, const std::string &Old);
     sys::Path Filename;
     bool DeleteIt;
   public:
-    FileRemover(const sys::Path &filename, bool deleteIt = true)
+    FileRemover() : DeleteIt(false) {}
+
+    explicit FileRemover(const sys::Path &filename, bool deleteIt = true)
       : Filename(filename), DeleteIt(deleteIt) {}
-    
+
     ~FileRemover() {
+      if (DeleteIt) {
+        // Ignore problems deleting the file.
+        Filename.eraseFromDisk();
+      }
+    }
+
+    /// setFile - Give ownership of the file to the FileRemover so it will
+    /// be removed when the object is destroyed.  If the FileRemover already
+    /// had ownership of a file, remove it first.
+    void setFile(const sys::Path &filename, bool deleteIt = true) {
       if (DeleteIt)
-        try {
-          Filename.destroyFile();
-        } catch (...) {}             // Ignore problems deleting the file.
+        Filename.eraseFromDisk();
+
+      Filename = filename;
+      DeleteIt = deleteIt;
     }
 
     /// releaseFile - Take ownership of the file away from the FileRemover so it