@ -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
}