/***************************************************************************** * AppleSAWS - The Apple Software Analysis WorkShop * * Copyright (C) 2015-2021 Mark D. Long * * * * 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 "assemblersymbols.h" AssemblerSymbols::AssemblerSymbols(QObject *parent) : QObject(parent) { } int AssemblerSymbols::locationOfSymbolAtAddress(quint16 address) { // Assume list m_assemblerSymbols is sorted by address (it should be) QListIterator it(m_assemblerSymbols); int idx = 0; while (it.hasNext()) { AssemblerSymbol ep = it.next(); if (ep.address == address) return idx; if (ep.address > address) return -1; idx++; } return -1; } QString AssemblerSymbols::getSymbolAtAddress(quint16 address) { int loc = locationOfSymbolAtAddress(address); if (loc < 0) { return ""; } else { return m_assemblerSymbols.at(loc).name; } } bool AssemblerSymbols::hasAssemSymbolAtAddress(quint16 address) { // Assume list m_assemblerSymbols is sorted by address (it should be) QListIterator it(m_assemblerSymbols); while (it.hasNext()) { AssemblerSymbol ep = it.next(); if (ep.address == address) return true; if (ep.address > address) return false; } return false; } void AssemblerSymbols::editSymbol(int location, AssemblerSymbol newSymbol) { if (m_assemblerSymbols.at(location).address == newSymbol.address) { m_assemblerSymbols[location].name = newSymbol.name; emit symbolChangedAt(location); } else { removeSymbolAt(location); addSymbol(newSymbol); } } void AssemblerSymbols::addSymbol(AssemblerSymbol ep) { if (hasAssemSymbolAtAddress(ep.address)) return; int idx = 0; for (; idx < m_assemblerSymbols.count(); idx++) { if (ep.address < m_assemblerSymbols[idx].address) break; } m_assemblerSymbols.insert(idx,ep); emit symbolAddedAt(idx); emit symbolAdded(ep,idx); } void AssemblerSymbols::removeSymbolAt(int location) { m_assemblerSymbols.removeAt(location); } //--------------------------------------------------------------------------- // STREAMING OPERATORS QDataStream &AssemblerSymbols::read(QDataStream &dataStream) { quint8 version; dataStream >> version; if (version == 0) { dataStream >> m_assemblerSymbols; } else qWarning("Unhandled version of AssemSymbolModel (%d) found in QDataStream",version); return dataStream; } QDataStream &AssemblerSymbols::write(QDataStream &dataStream) const { quint8 version = 0; // Increment this and update read() if new items are added dataStream << version; dataStream << m_assemblerSymbols; return dataStream; } QDataStream &operator<<(QDataStream &out, const AssemblerSymbols &model) { return model.write(out); } QDataStream &operator>>(QDataStream &in, AssemblerSymbols&model) { return model.read(in); } QDataStream &operator<<(QDataStream &out, const AssemblerSymbol &model) { out << model.address; out << model.name; out << (qint32) model.symbolsize; return out; } QDataStream &operator>>(QDataStream &in, AssemblerSymbol &model) { in >> model.address; in >> model.name; qint32 size; in >> size; model.symbolsize = (SymbolSize) size; return in; } //--------------------------------------------------------------------------- // TESTING void AssemblerSymbols::doTestData() { AssemblerSymbol ep; ep.address = 0x0100; ep.name = "Test Symbol 1"; addSymbol(ep); ep.address = 0x0200; ep.name = "Test Symbol 2"; addSymbol(ep); ep.address = 0x0300; ep.name = "Test Symbol 3"; addSymbol(ep); }