#include "symbol_map.moc" #include "symbol_file_adapters.cpp" // ------------------------------------------------------------------------ Symbol Symbols::getSymbol() { for (uint32_t i=0; i= left) { uint32_t cur = ((right - left) >> 1) + left; uint32_t curaddr = symbols[cur].address; if (address < curaddr) { right = cur - 1; } else if (address > curaddr) { left = cur + 1; } else { return cur; } } return -1; } // ------------------------------------------------------------------------ void SymbolMap::reset() { symbols.reset(); isModified = false; finishUpdates(); } // ------------------------------------------------------------------------ void SymbolMap::addLocation(uint32_t address, const string &name) { addSymbol(address, Symbol::createLocation(address, name)); } // ------------------------------------------------------------------------ void SymbolMap::addComment(uint32_t address, const string &name) { addSymbol(address, Symbol::createComment(address, name)); } // ------------------------------------------------------------------------ void SymbolMap::addSymbol(uint32_t address, const Symbol &name) { isValid = false; int32_t right = symbols.size(); for (int32_t i=0; ifetchAdapter( SymbolFileInterface::Writable, features, adapter ); string fileName = baseName; fileName.append(ext); ::nall::file f; if (!f.open((const char*)fileName, ::nall::file::mode::write)) { return false; } adapter_->write(f, this); adapter = adapter_; f.close(); isModified = false; return true; } // ------------------------------------------------------------------------ bool SymbolMap::loadFromFile(const string &baseName, const string &ext) { string fileName = baseName; fileName.append(ext); string buffer; if (buffer.readfile(fileName)) { return loadFromString(buffer); } return false; } // ------------------------------------------------------------------------ bool SymbolMap::loadFromString(const string &file) { nall::lstring rows; rows.split("\n", file); SymbolFileInterface *adapter_ = adapters->findBestAdapter(rows); if (adapter_ == NULL) { return false; } bool wasModified = isModified; if (adapter_->read(rows, this)) { finishUpdates(); isModified = wasModified; adapter = adapter_; return true; } return false; } // ------------------------------------------------------------------------