An update will be applied January 25th, between 12PM and 1:00PM EST (UTC -5:00). The site may be slow during that time.

Commit 9ae46ff2 authored by Brad King's avatar Brad King
Browse files

ENH: Improved implementation of FilesDiffer to avoid allocating enough memory...

ENH: Improved implementation of FilesDiffer to avoid allocating enough memory for the entire file twice.  Instead using a block-at-a-time comparison.
parent be259264
......@@ -1419,7 +1419,8 @@ bool SystemTools::CopyFileIfDifferent(const char* source,
return true;
}
#define KWSYS_ST_BUFFER 4096
bool SystemTools::FilesDiffer(const char* source,
const char* destination)
{
......@@ -1459,28 +1460,36 @@ bool SystemTools::FilesDiffer(const char* source,
return true;
}
char* source_buf = new char[statSource.st_size];
char* dest_buf = new char[statSource.st_size];
// Compare the files a block at a time.
char source_buf[KWSYS_ST_BUFFER];
char dest_buf[KWSYS_ST_BUFFER];
long nleft = statSource.st_size;
while(nleft > 0)
{
// Read a block from each file.
long nnext = (nleft > KWSYS_ST_BUFFER)? KWSYS_ST_BUFFER : nleft;
finSource.read(source_buf, nnext);
finDestination.read(dest_buf, nnext);
finSource.read(source_buf, statSource.st_size);
finDestination.read(dest_buf, statSource.st_size);
// If either failed to read assume they are different.
if(static_cast<long>(finSource.gcount()) != nnext ||
static_cast<long>(finDestination.gcount()) != nnext)
{
return true;
}
if(statSource.st_size != static_cast<long>(finSource.gcount()) ||
statSource.st_size != static_cast<long>(finDestination.gcount()))
{
// Failed to read files.
delete [] source_buf;
delete [] dest_buf;
return true;
}
int ret = memcmp((const void*)source_buf,
(const void*)dest_buf,
statSource.st_size);
// If this block differs the file differs.
if(memcmp((const void*)source_buf, (const void*)dest_buf, nnext) != 0)
{
return true;
}
delete [] dest_buf;
delete [] source_buf;
// Update the byte count remaining.
nleft -= nnext;
}
return ret != 0;
// No differences found.
return false;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment