blob: b1924662e4305317229dbef1d5df83f46c52a580 [file] [log] [blame]
Chris Lattner7a6ff2b2003-08-01 21:16:14 +00001//===- Support/FileUtilities.cpp - File System Utilities ------------------===//
John Criswellb576c942003-10-20 19:43:21 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Chris Lattner7a6ff2b2003-08-01 21:16:14 +00009//
10// This file implements a family of utility functions which are useful for doing
11// various things with files.
12//
13//===----------------------------------------------------------------------===//
14
Reid Spencer551ccae2004-09-01 22:55:40 +000015#include "llvm/Support/FileUtilities.h"
Reid Spencer9d88d1a2004-12-13 17:01:53 +000016#include "llvm/System/Path.h"
Chris Lattner7a6ff2b2003-08-01 21:16:14 +000017#include <fstream>
18#include <iostream>
Reid Spencer67f6d3a2004-12-15 01:46:54 +000019
Chris Lattner2cdd21c2003-12-14 21:35:53 +000020using namespace llvm;
Brian Gaeked0fde302003-11-11 22:41:34 +000021
Chris Lattner7a6ff2b2003-08-01 21:16:14 +000022/// DiffFiles - Compare the two files specified, returning true if they are
23/// different or if there is a file error. If you specify a string to fill in
24/// for the error option, it will set the string to an error message if an error
25/// occurs, allowing the caller to distinguish between a failed diff and a file
26/// system error.
27///
Chris Lattner2cdd21c2003-12-14 21:35:53 +000028bool llvm::DiffFiles(const std::string &FileA, const std::string &FileB,
29 std::string *Error) {
Chris Lattner7a6ff2b2003-08-01 21:16:14 +000030 std::ifstream FileAStream(FileA.c_str());
31 if (!FileAStream) {
32 if (Error) *Error = "Couldn't open file '" + FileA + "'";
33 return true;
34 }
35
36 std::ifstream FileBStream(FileB.c_str());
37 if (!FileBStream) {
38 if (Error) *Error = "Couldn't open file '" + FileB + "'";
39 return true;
40 }
41
42 // Compare the two files...
43 int C1, C2;
44 do {
45 C1 = FileAStream.get();
46 C2 = FileBStream.get();
47 if (C1 != C2) return true;
48 } while (C1 != EOF);
49
50 return false;
51}
52
Chris Lattner7a6ff2b2003-08-01 21:16:14 +000053/// MoveFileOverIfUpdated - If the file specified by New is different than Old,
54/// or if Old does not exist, move the New file over the Old file. Otherwise,
55/// remove the New file.
56///
Chris Lattner2cdd21c2003-12-14 21:35:53 +000057void llvm::MoveFileOverIfUpdated(const std::string &New,
58 const std::string &Old) {
Chris Lattner7a6ff2b2003-08-01 21:16:14 +000059 if (DiffFiles(New, Old)) {
60 if (std::rename(New.c_str(), Old.c_str()))
61 std::cerr << "Error renaming '" << New << "' to '" << Old << "'!\n";
62 } else {
63 std::remove(New.c_str());
64 }
65}
Misha Brukman3d1b0c72003-08-07 21:28:50 +000066
67/// removeFile - Delete the specified file
68///
Chris Lattner2cdd21c2003-12-14 21:35:53 +000069void llvm::removeFile(const std::string &Filename) {
Misha Brukman3d1b0c72003-08-07 21:28:50 +000070 std::remove(Filename.c_str());
71}
72
John Criswell6991a032003-09-02 20:14:57 +000073
Chris Lattner2d6481c2003-12-29 21:35:05 +000074//===----------------------------------------------------------------------===//
75// FDHandle class implementation
76//
77
Chris Lattner9b448b72003-12-29 21:43:58 +000078FDHandle::~FDHandle() throw() {
Chris Lattner2d6481c2003-12-29 21:35:05 +000079 if (FD != -1) close(FD);
80}
81
Chris Lattner9b448b72003-12-29 21:43:58 +000082FDHandle &FDHandle::operator=(int fd) throw() {
Chris Lattner2d6481c2003-12-29 21:35:05 +000083 if (FD != -1) close(FD);
84 FD = fd;
85 return *this;
86}