/*************************************************************************** * Copyright (C) 2007 Nicolas Hadacek * * * * 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 "cdb_parser.h" #include #include "common/global/pfile.h" //---------------------------------------------------------------------------- const CDB::ScopeType::Data CDB::ScopeType::DATA[Nb_Types] = { { "G", I18N_NOOP("Global") }, { "F", I18N_NOOP("File") }, { "L", I18N_NOOP("Local") }, { "S", I18N_NOOP("Structure") } // ?? }; const CDB::VarType::Data CDB::VarType::DATA[Nb_Types] = { { "DA", I18N_NOOP("Array") }, { "DF", I18N_NOOP("Function") }, { "DG", I18N_NOOP("Generic Pointer") }, { "DC", I18N_NOOP("Code Pointer") }, { "DX", I18N_NOOP("External RAM Pointer") }, { "DD", I18N_NOOP("Internal RAM Pointer") }, { "DP", I18N_NOOP("Paged Pointer") }, { "DI", I18N_NOOP("Upper-128-byte Pointer") }, { "SL", I18N_NOOP("Long") }, { "SI", I18N_NOOP("Int") }, { "SC", I18N_NOOP("Char") }, { "SS", I18N_NOOP("Short") }, { "SV", I18N_NOOP("Void") }, { "SF", I18N_NOOP("Float") }, { "ST", I18N_NOOP("Structure") }, { "SX", I18N_NOOP("SBIT") }, { "SB", I18N_NOOP("Bit Field") } }; const CDB::Sign::Data CDB::Sign::DATA[Nb_Types] = { { "S", I18N_NOOP("Signed") }, { "U", I18N_NOOP("Unsigned") } }; const CDB::AddressSpaceType::Data CDB::AddressSpaceType::DATA[Nb_Types] = { { "A", I18N_NOOP("External Stack") }, { "B", I18N_NOOP("Internal Stack") }, { "C", I18N_NOOP("Code") }, { "D", I18N_NOOP("Code / Static Segment") }, { "E", I18N_NOOP("Lower-128-byte Internal RAM") }, { "F", I18N_NOOP("External RAM") }, { "G", I18N_NOOP("Internal RAM") }, { "H", I18N_NOOP("Bit Addressable") }, { "I", I18N_NOOP("SFR Space") }, { "J", I18N_NOOP("SBIT Space") }, { "R", I18N_NOOP("Register Space") }, { "Z", I18N_NOOP("Function or Undefined Space") }, }; //---------------------------------------------------------------------------- CDB::Object::Object(const PURL::Url &url, Log::Base &log) : _log(log) { PURL::File file(url, log); if ( !file.openForRead() ) return; TQStringList lines = file.readLines(); for (_line=0; _linefilename, 0); } bool CDB::Object::parse(Scope &scope, TQString &name) { TQString s; if ( !readFixedLengthString(s, 1) ) return false; scope.type = ScopeType::fromKey(s); switch (scope.type.type()) { case ScopeType::Structure: case ScopeType::Global: break; case ScopeType::File: case ScopeType::Local: if ( !readStoppedString(scope.name, '$') ) return false; break; case ScopeType::Nb_Types: logMalformed(i18n("unknown ScopeType")); return false; } if ( !readAndCheckChar('$') ) return false; if ( !readStoppedString(name, '$') ) return false; if ( !readAndCheckChar('$') ) return false; if ( !readUInt(scope.level) ) return false; if ( !readAndCheckChar('$') ) return false; if ( !readUInt(scope.block) ) return false; return true; } bool CDB::Object::parse(TypeChain &typeChain) { uint nb; if ( !readAndCheckChar('{') ) return false; if ( !readUInt(nb) ) return false; if ( !readAndCheckChar('}') ) return false; TQString s; if ( !readStoppedString(s, ':') ) return false; TQStringList list = TQStringList::split(',', s, true); for (uint i=0; iisInterruptHandler) ) return false; if ( !readAndCheckChar(',') ) return false; if ( !readUInt(fr->interruptHandler) ) return false; if ( !readAndCheckChar(',') ) return false; if ( !readUInt(fr->registerBank) ) return false; return true; } bool CDB::Object::parseTypeRecord(Record * &record) { TypeRecord *tr = new TypeRecord; record = tr; if ( !readAndCheckChar('F') ) return false; if ( !readStoppedString(tr->filename, '$') ) return false; if ( !readAndCheckChar('$') ) return false; if ( !readStoppedString(tr->name, '[') ) return false; if ( !readAndCheckChar('[') ) return false; for (;;) { TypeMember tm; if ( !parse(tm) ) return false; tr->members.append(tm); if ( _current[_col]==']' ) break; } if ( !readAndCheckChar(']') ) return false; return true; } bool CDB::Object::parseLinkerRecord(Record * &record) { LinkerRecord *lr = new LinkerRecord; record = lr; char c; if ( !readChar(c) ) return false; switch (c) { case 'A': lr->type = LinkerRecord::AsmLine; if ( !readAndCheckChar('$') ) return false; if ( !readStoppedString(lr->filename, '$') ) return false; if ( !readAndCheckChar('$') ) return false; if ( !readUInt(lr->line) ) return false; break; case 'C': lr->type = LinkerRecord::CLine; if ( !readAndCheckChar('$') ) return false; if ( !readStoppedString(lr->filename, '$') ) return false; if ( !readAndCheckChar('$') ) return false; if ( !readUInt(lr->line) ) return false; if ( !readAndCheckChar('$') ) return false; if ( !readUInt(lr->level) ) return false; if ( !readAndCheckChar('$') ) return false; if ( !readUInt(lr->block) ) return false; break; case 'X': lr->type = LinkerRecord::EndAddress; if ( !parse(lr->scope, lr->name) ) return false; break; default: lr->type = LinkerRecord::Address; if ( !parse(lr->scope, lr->name) ) return false; break; } if ( !readAndCheckChar(':') ) return false; if ( !readHex(lr->address) ) return false; return true; }