blob: b16fc37e2b707e8cfcf11f7d180c5532dcd1be16 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "compare.h"
#include <log4cxx/helpers/pool.h>
#include <log4cxx/file.h>
#include <log4cxx/helpers/stringhelper.h>
#include <log4cxx/helpers/fileinputstream.h>
#include <log4cxx/helpers/inputstreamreader.h>
#include <log4cxx/helpers/systemoutwriter.h>
using namespace log4cxx;
using namespace log4cxx::helpers;
bool Compare::compare(const File& file1, const File& file2)
{
Pool pool;
InputStreamPtr fileIn1 = new FileInputStream(file1);
InputStreamReaderPtr reader1 = new InputStreamReader(fileIn1);
LogString in1(reader1->read(pool));
Pool pool2;
InputStreamPtr fileIn2 = new FileInputStream(file2);
InputStreamReaderPtr reader2 = new InputStreamReader(fileIn2);
LogString in2(reader2->read(pool2));
LogString back1(in1);
LogString back2(in2);
LogString s1;
LogString s2;
int lineCounter = 0;
while (getline(in1, s1))
{
lineCounter++;
if (!getline(in2, s2))
{
s2.erase(s2.begin(), s2.end());
}
if (s1 != s2)
{
LogString msg(LOG4CXX_STR("Files ["));
msg += file1.getPath();
msg += LOG4CXX_STR("] and [");
msg += file2.getPath();
msg += LOG4CXX_STR("] differ on line ");
StringHelper::toString(lineCounter, pool, msg);
msg += LOG4CXX_EOL;
msg += LOG4CXX_STR("One reads: [");
msg += s1;
msg += LOG4CXX_STR("].");
msg += LOG4CXX_EOL;
msg += LOG4CXX_STR("Other reads:[");
msg += s2;
msg += LOG4CXX_STR("].");
msg += LOG4CXX_EOL;
emit(msg);
outputFile(file1, back1, pool);
outputFile(file2, back2, pool);
return false;
}
}
// the second file is longer
if (getline(in2, s2))
{
LogString msg(LOG4CXX_STR("File ["));
msg += file2.getPath();
msg += LOG4CXX_STR("] longer than file [");
msg += file1.getPath();
msg += LOG4CXX_STR("].");
msg += LOG4CXX_EOL;
emit(msg);
outputFile(file1, back1, pool);
outputFile(file2, back2, pool);
return false;
}
return true;
}
void Compare::outputFile(const File& file,
const LogString& contents,
log4cxx::helpers::Pool& pool)
{
int lineCounter = 0;
emit(LOG4CXX_STR("--------------------------------"));
emit(LOG4CXX_EOL);
LogString msg(LOG4CXX_STR("Contents of "));
msg += file.getPath();
msg += LOG4CXX_STR(":");
msg += LOG4CXX_EOL;
emit(msg);
LogString in1(contents);
LogString s1;
while (getline(in1, s1))
{
lineCounter++;
LogString line;
StringHelper::toString(lineCounter, pool, line);
emit(line);
if (lineCounter < 10)
{
emit(LOG4CXX_STR(" : "));
}
else if (lineCounter < 100)
{
emit(LOG4CXX_STR(" : "));
}
else if (lineCounter < 1000)
{
emit(LOG4CXX_STR(" : "));
}
else
{
emit(LOG4CXX_STR(": "));
}
emit(s1);
emit(LOG4CXX_EOL);
}
}
void Compare::emit(const LogString& s1)
{
SystemOutWriter::write(s1);
}
bool Compare::getline(LogString& in, LogString& line)
{
if (in.empty())
{
return false;
}
size_t nl = in.find(0x0A);
if (nl == std::string::npos)
{
line = in;
in.erase(in.begin(), in.end());
}
else
{
//
// if the file has CR-LF then
// drop the carriage return alse
//
if (nl > 0 && in[nl - 1] == 0x0D)
{
line.assign(in, 0, nl - 1);
}
else
{
line.assign(in, 0, nl);
}
in.erase(in.begin(), in.begin() + nl + 1);
}
return true;
}