summaryrefslogtreecommitdiffstats
path: root/src/common/file_util.cpp
diff options
context:
space:
mode:
authorLioncash <mathew1800@gmail.com>2018-07-22 05:04:24 +0200
committerLioncash <mathew1800@gmail.com>2018-07-22 05:08:55 +0200
commitc5de0a67a82c641518590a12cf394eed4b85ccaf (patch)
treebeb7ef55d87872f810c19fd76aa3e6b0af620ea9 /src/common/file_util.cpp
parentMerge pull request #759 from lioncash/redundant (diff)
downloadyuzu-c5de0a67a82c641518590a12cf394eed4b85ccaf.tar
yuzu-c5de0a67a82c641518590a12cf394eed4b85ccaf.tar.gz
yuzu-c5de0a67a82c641518590a12cf394eed4b85ccaf.tar.bz2
yuzu-c5de0a67a82c641518590a12cf394eed4b85ccaf.tar.lz
yuzu-c5de0a67a82c641518590a12cf394eed4b85ccaf.tar.xz
yuzu-c5de0a67a82c641518590a12cf394eed4b85ccaf.tar.zst
yuzu-c5de0a67a82c641518590a12cf394eed4b85ccaf.zip
Diffstat (limited to 'src/common/file_util.cpp')
-rw-r--r--src/common/file_util.cpp38
1 files changed, 14 insertions, 24 deletions
diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp
index d8163a4a8..819ffd6ff 100644
--- a/src/common/file_util.cpp
+++ b/src/common/file_util.cpp
@@ -2,6 +2,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <array>
+#include <memory>
#include <sstream>
#include <unordered_map>
#include "common/assert.h"
@@ -275,14 +277,10 @@ bool Copy(const std::string& srcFilename, const std::string& destFilename) {
GetLastErrorMsg());
return false;
#else
-
-// buffer size
-#define BSIZE 1024
-
- char buffer[BSIZE];
+ using CFilePointer = std::unique_ptr<FILE, decltype(&std::fclose)>;
// Open input file
- FILE* input = fopen(srcFilename.c_str(), "rb");
+ CFilePointer input{fopen(srcFilename.c_str(), "rb"), std::fclose};
if (!input) {
LOG_ERROR(Common_Filesystem, "opening input failed {} --> {}: {}", srcFilename,
destFilename, GetLastErrorMsg());
@@ -290,44 +288,36 @@ bool Copy(const std::string& srcFilename, const std::string& destFilename) {
}
// open output file
- FILE* output = fopen(destFilename.c_str(), "wb");
+ CFilePointer output{fopen(destFilename.c_str(), "wb"), std::fclose};
if (!output) {
- fclose(input);
LOG_ERROR(Common_Filesystem, "opening output failed {} --> {}: {}", srcFilename,
destFilename, GetLastErrorMsg());
return false;
}
// copy loop
- while (!feof(input)) {
+ std::array<char, 1024> buffer;
+ while (!feof(input.get())) {
// read input
- size_t rnum = fread(buffer, sizeof(char), BSIZE, input);
- if (rnum != BSIZE) {
- if (ferror(input) != 0) {
+ size_t rnum = fread(buffer.data(), sizeof(char), buffer.size(), input.get());
+ if (rnum != buffer.size()) {
+ if (ferror(input.get()) != 0) {
LOG_ERROR(Common_Filesystem, "failed reading from source, {} --> {}: {}",
srcFilename, destFilename, GetLastErrorMsg());
- goto bail;
+ return false;
}
}
// write output
- size_t wnum = fwrite(buffer, sizeof(char), rnum, output);
+ size_t wnum = fwrite(buffer.data(), sizeof(char), rnum, output.get());
if (wnum != rnum) {
LOG_ERROR(Common_Filesystem, "failed writing to output, {} --> {}: {}", srcFilename,
destFilename, GetLastErrorMsg());
- goto bail;
+ return false;
}
}
- // close files
- fclose(input);
- fclose(output);
+
return true;
-bail:
- if (input)
- fclose(input);
- if (output)
- fclose(output);
- return false;
#endif
}