You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
piklab/src/libgui/object_view.cpp

146 lines
5.4 KiB

/***************************************************************************
* Copyright (C) 2006 Nicolas Hadacek <hadacek@kde.org> *
* *
* 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 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include "object_view.h"
#include <klocale.h>
#include "devices/base/device_group.h"
#include "devices/pic/pic/pic_memory.h"
#include "tools/gputils/gputils.h"
#include "hex_editor.h"
#include "coff/base/text_coff.h"
#include "coff/base/coff_archive.h"
#include "main_global.h"
#include "tools/list/compile_process.h"
#include "coff/base/disassembler.h"
#include "common/gui/misc_gui.h"
//-----------------------------------------------------------------------------
Coff::BaseEditor::BaseEditor(const PURL::Url &source, const Device::Data *data, TQWidget *parent)
: SimpleTextEditor(true, parent), _source(source), _ok(false), _created(0), _device(data)
{
setReadOnly(true);
_view->setDynWordWrap(false);
setView(&Main::compileLog());
}
Coff::BaseEditor::~BaseEditor()
{
delete _created;
}
//-----------------------------------------------------------------------------
Coff::CoffEditor::CoffEditor(const PURL::Url &source, const Device::Data &data, TQWidget *parent)
: BaseEditor(source, &data, parent), _provided(0)
{}
Coff::CoffEditor::CoffEditor(const TextObject &object, TQWidget *parent)
: BaseEditor(PURL::Url(), object.device(), parent), _provided(&object)
{}
bool Coff::CoffEditor::open(const PURL::Url &url)
{
_url = url;
if (_provided) return setText(_provided->disassembly());
if ( _created==0 ) {
_created = new TextObject(_device, _source);
_ok = _created->parse(*this);
}
return setText(static_cast<Coff::TextObject *>(_created)->disassembly());
}
//-----------------------------------------------------------------------------
Coff::ObjectEditor::ObjectEditor(const PURL::Url &source, TQWidget *parent)
: BaseEditor(source, 0, parent)
{}
bool Coff::ObjectEditor::open(const PURL::Url &url)
{
_url = url;
if ( _created==0 ) {
_created = new TextObject(0, _source);
_ok = _created->parse(*this);
}
if ( !_ok ) return setText(i18n("Error parsing object:\n") + error());
TQString s = coff()->information().text() + "\n";
return setText(s);
}
//-----------------------------------------------------------------------------
Coff::LibraryEditor::LibraryEditor(const PURL::Url &source, TQWidget *parent)
: BaseEditor(source, 0, parent)
{}
bool Coff::LibraryEditor::open(const PURL::Url &url)
{
_url = url;
if ( _created==0 ) {
_created = new Archive(_source);
_ok = _created->parse(*this);
}
if ( !_ok ) return setText(i18n("Error parsing library:\n") + error());
TQString s = coff()->information().text() + "\n";
if ( coff()->members().count()!=0 ) s += coff()->membersInformation().text() + "\n";
if ( coff()->symbols().count()!=0 ) s += coff()->symbolsInformation().text() + "\n";
return setText(s);
}
//-----------------------------------------------------------------------------
DisassemblyEditor::DisassemblyEditor(const PURL::Url &source, const Device::Data &data, TQWidget *parent)
: SimpleTextEditor(true, parent), _source(source), _device(data), _editor(0)
{
setReadOnly(true);
_view->setDynWordWrap(false);
setView(&Main::compileLog());
}
DisassemblyEditor::DisassemblyEditor(const HexEditor &e, const Device::Data &data, TQWidget *parent)
: SimpleTextEditor(true, parent), _device(data), _editor(&e)
{
setReadOnly(true);
_view->setDynWordWrap(false);
setView(&Main::compileLog());
}
bool DisassemblyEditor::open(const PURL::Url &url)
{
_url = url;
if ( Main::toolGroup().name()!="sdcc" && Main::toolGroup().name()!="gputils" ) {
MessageBox::sorry(i18n("Disassembly not supported for the selected toolchain."), Log::Show);
return false;
}
Pic::Architecture arch = (_device.group().name()=="pic" ? static_cast<const Pic::Data &>(_device).architecture() : Pic::Architecture(Pic::Architecture::Nb_Types));
if ( arch==Pic::Architecture::Nb_Types ) {
MessageBox::sorry(i18n("Disassembly not supported for the selected device."), Log::Show);
return false;
}
Device::Memory *memory = 0;
if ( _editor==0 ) {
log(Log::LineType::Information, i18n("Disassembling hex file: %1").tqarg(_source.pretty()));
PURL::File file(_source, Main::compileLog());
if ( !file.openForRead() ) return false;
memory = _device.group().createMemory(_device);
TQStringList errors, warnings;
Device::Memory::WarningTypes warningTypes;
if ( !memory->load(file.stream(), errors, warningTypes, warnings) ) {
delete memory;
log(Log::LineType::Error, errors[0]);
return false;
}
for (uint i=0; i<warnings.count(); i++) log(Log::LineType::Warning, warnings[i]);
} else {
log(Log::LineType::Information, i18n("Disassembling content of hex file editor."));
memory = const_cast<Device::Memory *>(_editor->memory());
}
SourceLine::List list = GPUtils::disassemble(static_cast<const Pic::Memory &>(*memory));
if ( _editor==0 ) delete memory;
return setText(SourceLine::text(PURL::SourceFamily::Asm, list, 4));
}