Silence a VS warning.
[oota-llvm.git] / lib / Support / FileUtilities.cpp
1 //===- Support/FileUtilities.cpp - File System Utilities ------------------===//
2 // 
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 //===----------------------------------------------------------------------===//
9 //
10 // This file implements a family of utility functions which are useful for doing
11 // various things with files.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm/Support/FileUtilities.h"
16 #include "llvm/System/Path.h"
17 #include <fstream>
18 #include <iostream>
19
20 using namespace llvm;
21
22 /// 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 ///
28 bool llvm::DiffFiles(const std::string &FileA, const std::string &FileB,
29                      std::string *Error) {
30   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
53 /// 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 ///
57 void llvm::MoveFileOverIfUpdated(const std::string &New,
58                                  const std::string &Old) {
59   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 }