1//===- llvm/Support/FileUtilities.h - File System Utilities -----*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines a family of utility functions which are useful for doing
11// various things with files.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_SUPPORT_FILEUTILITIES_H
16#define LLVM_SUPPORT_FILEUTILITIES_H
17
18#include "llvm/Support/FileSystem.h"
19#include "llvm/Support/Path.h"
20
21namespace llvm {
22
23  /// DiffFilesWithTolerance - Compare the two files specified, returning 0 if
24  /// the files match, 1 if they are different, and 2 if there is a file error.
25  /// This function allows you to specify an absolute and relative FP error that
26  /// is allowed to exist.  If you specify a string to fill in for the error
27  /// option, it will set the string to an error message if an error occurs, or
28  /// if the files are different.
29  ///
30  int DiffFilesWithTolerance(StringRef FileA,
31                             StringRef FileB,
32                             double AbsTol, double RelTol,
33                             std::string *Error = nullptr);
34
35
36  /// FileRemover - This class is a simple object meant to be stack allocated.
37  /// If an exception is thrown from a region, the object removes the filename
38  /// specified (if deleteIt is true).
39  ///
40  class FileRemover {
41    SmallString<128> Filename;
42    bool DeleteIt;
43  public:
44    FileRemover() : DeleteIt(false) {}
45
46    explicit FileRemover(const Twine& filename, bool deleteIt = true)
47      : DeleteIt(deleteIt) {
48      filename.toVector(Filename);
49    }
50
51    ~FileRemover() {
52      if (DeleteIt) {
53        // Ignore problems deleting the file.
54        sys::fs::remove(Filename.str());
55      }
56    }
57
58    /// setFile - Give ownership of the file to the FileRemover so it will
59    /// be removed when the object is destroyed.  If the FileRemover already
60    /// had ownership of a file, remove it first.
61    void setFile(const Twine& filename, bool deleteIt = true) {
62      if (DeleteIt) {
63        // Ignore problems deleting the file.
64        sys::fs::remove(Filename.str());
65      }
66
67      Filename.clear();
68      filename.toVector(Filename);
69      DeleteIt = deleteIt;
70    }
71
72    /// releaseFile - Take ownership of the file away from the FileRemover so it
73    /// will not be removed when the object is destroyed.
74    void releaseFile() { DeleteIt = false; }
75  };
76} // End llvm namespace
77
78#endif
79