//
// srecord - manipulate eprom load files
// Copyright (C) 1998-2002, 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
#include
#include
using namespace std;
#include
#include
#include
int
main(int argc, char **argv)
{
srec_arglex cmdline(argc, argv);
cmdline.token_first();
typedef vector infile_t;
infile_t infile;
while (cmdline.token_cur() != 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:
infile.push_back(cmdline.get_input());
continue;
}
cmdline.token_next();
}
if (infile.size() == 0)
infile.push_back(cmdline.get_input());
//
// Read each file and emit informative gumph.
//
for (infile_t::iterator it = infile.begin(); it != infile.end(); ++it)
{
srec_input *ifp = *it;
if (infile.size() > 1)
{
cout << endl;
cout << ifp->filename() << ":" << endl;
}
cout << "Format: " << ifp->get_file_format_name() << endl;
srec_record record;
interval range;
while (ifp->read(record))
{
switch (record.get_type())
{
case srec_record::type_header:
if (record.get_length() < 1)
break;
cout << "Header: \"";
for (int j = 0; j < record.get_length(); ++j)
{
int c = record.get_data(j) & 127;
if (c == '\\' || c == '"')
cout << '\\' << (char)c;
else if (isprint(c))
cout << (char)c;
else
{
char buf[16];
snprintf(buf, sizeof(buf), "\\%03o", c);
cout << buf;
}
}
cout << "\"" << endl;
break;
case srec_record::type_data:
range +=
interval
(
record.get_address(),
record.get_address() + record.get_length()
);
break;
case srec_record::type_start_address:
{
cout << "Start: ";
char buf[16];
snprintf(buf, sizeof(buf), "%08lX", record.get_address());
cout << buf << endl;
}
break;
default:
// ignored
break;
}
}
if (range.empty())
{
cout << "Data: none" << endl;
continue;
}
int prec = 4;
if (range.get_highest() > (1L << 24))
prec = 8;
else if (range.get_highest() > (1L << 16))
prec = 6;
bool first_line = true;
for (;;)
{
interval tmp = range;
tmp.first_interval_only();
if (first_line)
{
cout << "Data: ";
first_line = false;
}
else
cout << " ";
char buf[32];
snprintf(buf, sizeof(buf), "%0*lX", prec, tmp.get_lowest());
cout << buf << " - ";
snprintf(buf, sizeof(buf), "%0*lX", prec, tmp.get_highest() - 1);
cout << buf << endl;
range -= tmp;
if (range.empty())
break;
}
}
//
// success
//
exit(0);
return 0;
}