//
// srecord - manipulate eprom load files
// Copyright (C) 1998-2003, 2005-2007 Peter Miller
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see
// .
//
#include
#include
#include
#include
#include
using namespace std;
#include
#include
static bool
start_addresses_differ(srec_record *rp1, srec_record *rp2)
{
return (rp1 && rp2 && rp1->get_address() != rp2->get_address());
}
int
main(int argc, char **argv)
{
srec_arglex cmdline(argc, argv);
cmdline.usage_tail_set(" ");
cmdline.token_first();
srec_input *if1 = 0;
srec_input *if2 = 0;
bool verbose = false;
while (cmdline.token_cur() != srec_arglex::token_eoln)
{
switch (cmdline.token_cur())
{
default:
cmdline.default_command_line_processing();
continue;
case srec_arglex::token_string:
case srec_arglex::token_stdio:
case srec_arglex::token_generator:
if (!if1)
if1 = cmdline.get_input();
else if (!if2)
if2 = cmdline.get_input();
else
{
cerr << argv[0] << ": too many input files specified" << endl;
cmdline.usage();
}
continue;
case arglex::token_verbose:
verbose = true;
break;
}
cmdline.token_next();
}
if (!if1 || !if2)
{
cerr << argv[0] << ": two input files required" << endl;
cmdline.usage();
}
//
// Read the first file into memory.
//
srec_memory *mp1 = new srec_memory();
mp1->reader(if1);
//
// Read the second file into memory.
//
srec_memory *mp2 = new srec_memory();
mp2->reader(if2);
//
// Error message and non-zero exit status if the files differ.
//
if (verbose)
{
bool different = srec_memory::compare(*mp1, *mp2);
if
(
start_addresses_differ
(
mp1->get_start_address(),
mp2->get_start_address()
)
)
{
cout << hex << "Start address "
<< mp1->get_start_address()->get_address()
<< " not equal to " << mp2->get_start_address()->get_address()
<< "." << dec << endl;
different = true;
}
if (different)
exit(2);
cerr << argv[0] << ": files \"" << if1->filename() << "\" and \""
<< if2->filename() << "\" are the same." << endl;
}
else
{
if
(
*mp1 != *mp2
||
start_addresses_differ
(
mp1->get_start_address(),
mp2->get_start_address()
)
)
{
cerr << argv[0] << ": files \"" << if1->filename() << "\" and \""
<< if2->filename() << "\" differ" << endl;
exit(2);
}
}
delete if1;
delete if2;
//
// success
//
exit(0);
return 0;
}