diff options
Diffstat (limited to 'support/lib/Support/FileUtilities.cpp')
-rw-r--r-- | support/lib/Support/FileUtilities.cpp | 203 |
1 files changed, 0 insertions, 203 deletions
diff --git a/support/lib/Support/FileUtilities.cpp b/support/lib/Support/FileUtilities.cpp deleted file mode 100644 index ca4603628c..0000000000 --- a/support/lib/Support/FileUtilities.cpp +++ /dev/null @@ -1,203 +0,0 @@ -//===- Support/FileUtilities.cpp - File System Utilities ------------------===// -// -// This file implements a family of utility functions which are useful for doing -// various things with files. -// -//===----------------------------------------------------------------------===// - -#include "Support/FileUtilities.h" -#include "Config/unistd.h" -#include "Config/sys/stat.h" -#include "Config/sys/types.h" -#include <fstream> -#include <iostream> -#include <cstdio> - -/// 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) { - std::ifstream FileAStream(FileA.c_str()); - if (!FileAStream) { - if (Error) *Error = "Couldn't open file '" + FileA + "'"; - return true; - } - - std::ifstream FileBStream(FileB.c_str()); - if (!FileBStream) { - if (Error) *Error = "Couldn't open file '" + FileB + "'"; - return true; - } - - // Compare the two files... - int C1, C2; - do { - C1 = FileAStream.get(); - C2 = FileBStream.get(); - if (C1 != C2) return true; - } while (C1 != EOF); - - return false; -} - - -/// 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) { - if (DiffFiles(New, Old)) { - if (std::rename(New.c_str(), Old.c_str())) - std::cerr << "Error renaming '" << New << "' to '" << Old << "'!\n"; - } else { - std::remove(New.c_str()); - } -} - -/// removeFile - Delete the specified file -/// -void removeFile(const std::string &Filename) { - std::remove(Filename.c_str()); -} - -/// getUniqueFilename - Return a filename with the specified prefix. If the -/// file does not exist yet, return it, otherwise add a suffix to make it -/// unique. -/// -std::string getUniqueFilename(const std::string &FilenameBase) { - if (!std::ifstream(FilenameBase.c_str())) - return FilenameBase; // Couldn't open the file? Use it! - - // Create a pattern for mkstemp... - char *FNBuffer = new char[FilenameBase.size()+8]; - strcpy(FNBuffer, FilenameBase.c_str()); - strcpy(FNBuffer+FilenameBase.size(), "-XXXXXX"); - - // Agree on a temporary file name to use.... - int TempFD; - if ((TempFD = mkstemp(FNBuffer)) == -1) { - std::cerr << "bugpoint: ERROR: Cannot create temporary file in the current " - << " directory!\n"; - exit(1); - } - - // We don't need to hold the temp file descriptor... we will trust that no one - // will overwrite/delete the file while we are working on it... - close(TempFD); - std::string Result(FNBuffer); - delete[] FNBuffer; - return Result; -} - -/// -/// Method: MakeFileExecutable () -/// -/// Description: -/// This method makes the specified filename executable by giving it -/// execute permission. It respects the umask value of the process, and it -/// does not enable any unnecessary access bits. -/// -/// Algorithm: -/// o Get file's current permissions. -/// o Get the process's current umask. -/// o Take the set of all execute bits and disable those found in the umask. -/// o Add the remaining permissions to the file's permissions. -/// -bool -MakeFileExecutable (const std::string & Filename) -{ - // Permissions masking value of the user - mode_t mask; - - // Permissions currently enabled on the file - struct stat fstat; - - // - // Grab the umask value from the operating system. We want to use it when - // changing the file's permissions. - // - // Note: - // Umask() is one of those annoying system calls. You have to call it - // to get the current value and then set it back. - // - mask = umask (0x777); - umask (mask); - - // - // Go fetch the file's current permission bits. We want to *add* execute - // access to the file. - // - if ((stat (Filename.c_str(), &fstat)) == -1) - { - return false; - } - - // - // Make the file executable... - // - if ((chmod(Filename.c_str(), (fstat.st_mode | (0111 & ~mask)))) == -1) - { - return false; - } - - return true; -} - -/// -/// Method: MakeFileReadable () -/// -/// Description: -/// This method makes the specified filename readable by giving it -/// read permission. It respects the umask value of the process, and it -/// does not enable any unnecessary access bits. -/// -/// Algorithm: -/// o Get file's current permissions. -/// o Get the process's current umask. -/// o Take the set of all read bits and disable those found in the umask. -/// o Add the remaining permissions to the file's permissions. -/// -bool -MakeFileReadable (const std::string & Filename) -{ - // Permissions masking value of the user - mode_t mask; - - // Permissions currently enabled on the file - struct stat fstat; - - // - // Grab the umask value from the operating system. We want to use it when - // changing the file's permissions. - // - // Note: - // Umask() is one of those annoying system calls. You have to call it - // to get the current value and then set it back. - // - mask = umask (0x777); - umask (mask); - - // - // Go fetch the file's current permission bits. We want to *add* execute - // access to the file. - // - if ((stat (Filename.c_str(), &fstat)) == -1) - { - return false; - } - - // - // Make the file executable... - // - if ((chmod(Filename.c_str(), (fstat.st_mode | (0444 & ~mask)))) == -1) - { - return false; - } - - return true; -} - |