Files
clang-p2996/lldb/source/Host/common/FileSystem.cpp
Pavel Labath 1408bf7231 Remove TimeValue usage from FileSpec.h
Summary:
The only usage there was in GetModificationTime(). I also took the opportunity
to move this function from FileSpec to the FileSystem class - since we are
using FileSpecs to also represent remote files for which we cannot (easily)
retrieve modification time, it makes sense to make the decision to get the
modification time more explicit.

The new function returns a llvm::sys::TimePoint<>. To aid the transition
from TimeValue, I have added a constructor to it which enables implicit
conversion from a time_point.

Reviewers: zturner, clayborg

Subscribers: mehdi_amini, tberghammer, danalbert, beanz, mgorny, lldb-commits

Differential Revision: https://reviews.llvm.org/D25392

llvm-svn: 285702
2016-11-01 16:11:14 +00:00

103 lines
2.9 KiB
C++

//===-- FileSystem.cpp ------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "lldb/Host/FileSystem.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/MD5.h"
#include <algorithm>
#include <fstream>
#include <vector>
using namespace lldb;
using namespace lldb_private;
namespace {
bool CalcMD5(const FileSpec &file_spec, uint64_t offset, uint64_t length,
llvm::MD5::MD5Result &md5_result) {
llvm::MD5 md5_hash;
std::ifstream file(file_spec.GetPath(), std::ios::binary);
if (!file.is_open())
return false;
if (offset > 0)
file.seekg(offset, file.beg);
std::vector<char> read_buf(4096);
uint64_t total_read_bytes = 0;
while (!file.eof()) {
const uint64_t to_read =
(length > 0) ? std::min(static_cast<uint64_t>(read_buf.size()),
length - total_read_bytes)
: read_buf.size();
if (to_read == 0)
break;
file.read(&read_buf[0], to_read);
const auto read_bytes = file.gcount();
if (read_bytes == 0)
break;
md5_hash.update(llvm::StringRef(&read_buf[0], read_bytes));
total_read_bytes += read_bytes;
}
md5_hash.final(md5_result);
return true;
}
} // namespace
bool FileSystem::CalculateMD5(const FileSpec &file_spec, uint64_t &low,
uint64_t &high) {
return CalculateMD5(file_spec, 0, 0, low, high);
}
bool FileSystem::CalculateMD5(const FileSpec &file_spec, uint64_t offset,
uint64_t length, uint64_t &low, uint64_t &high) {
llvm::MD5::MD5Result md5_result;
if (!CalcMD5(file_spec, offset, length, md5_result))
return false;
const auto uint64_res = reinterpret_cast<const uint64_t *>(md5_result);
high = uint64_res[0];
low = uint64_res[1];
return true;
}
bool FileSystem::CalculateMD5AsString(const FileSpec &file_spec,
std::string &digest_str) {
return CalculateMD5AsString(file_spec, 0, 0, digest_str);
}
bool FileSystem::CalculateMD5AsString(const FileSpec &file_spec,
uint64_t offset, uint64_t length,
std::string &digest_str) {
llvm::MD5::MD5Result md5_result;
if (!CalcMD5(file_spec, offset, length, md5_result))
return false;
llvm::SmallString<32> result_str;
llvm::MD5::stringifyResult(md5_result, result_str);
digest_str = result_str.c_str();
return true;
}
llvm::sys::TimePoint<>
FileSystem::GetModificationTime(const FileSpec &file_spec) {
llvm::sys::fs::file_status status;
std::error_code ec = llvm::sys::fs::status(file_spec.GetPath(), status);
if (ec)
return llvm::sys::TimePoint<>();
return status.getLastModificationTime();
}