Fixed bug that kept us from parsing symbol files if any symbol was longer

than 24 characters. Thanks to Rich Boniface for pointing out the bug.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@544 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
urchlay 2005-06-22 20:25:20 +00:00
parent e8102b3ec3
commit a372543f0e
5 changed files with 48 additions and 16 deletions

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: Debugger.cxx,v 1.27 2005-06-22 18:30:42 stephena Exp $ // $Id: Debugger.cxx,v 1.28 2005-06-22 20:25:19 urchlay Exp $
//============================================================================ //============================================================================
#include "bspf.hxx" #include "bspf.hxx"
@ -622,3 +622,8 @@ bool Debugger::setHeight(int height)
string Debugger::showWatches() { string Debugger::showWatches() {
return myParser->showWatches(); return myParser->showWatches();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Debugger::addLabel(string label, int address) {
equateList->addEquate(label, address);
}

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: Debugger.hxx,v 1.24 2005-06-22 18:30:42 stephena Exp $ // $Id: Debugger.hxx,v 1.25 2005-06-22 20:25:19 urchlay Exp $
//============================================================================ //============================================================================
#ifndef DEBUGGER_HXX #ifndef DEBUGGER_HXX
@ -51,7 +51,7 @@ enum {
for all debugging operations in Stella (parser, 6502 debugger, etc). for all debugging operations in Stella (parser, 6502 debugger, etc).
@author Stephen Anthony @author Stephen Anthony
@version $Id: Debugger.hxx,v 1.24 2005-06-22 18:30:42 stephena Exp $ @version $Id: Debugger.hxx,v 1.25 2005-06-22 20:25:19 urchlay Exp $
*/ */
class Debugger : public DialogContainer class Debugger : public DialogContainer
{ {
@ -201,6 +201,7 @@ class Debugger : public DialogContainer
EquateList *equates(); EquateList *equates();
PromptWidget *prompt(); PromptWidget *prompt();
string showWatches(); string showWatches();
void addLabel(string label, int address);
PackedBitArray *breakpoints() { return breakPoints; } PackedBitArray *breakpoints() { return breakPoints; }
PackedBitArray *readtraps() { return readTraps; } PackedBitArray *readtraps() { return readTraps; }

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: DebuggerParser.cxx,v 1.25 2005-06-22 13:00:58 urchlay Exp $ // $Id: DebuggerParser.cxx,v 1.26 2005-06-22 20:25:19 urchlay Exp $
//============================================================================ //============================================================================
#include "bspf.hxx" #include "bspf.hxx"
@ -375,6 +375,9 @@ string DebuggerParser::run(const string& command) {
if(subStringMatch(verb, "loadsym")) { if(subStringMatch(verb, "loadsym")) {
result = debugger->equateList->loadFile(argStrings[0]); result = debugger->equateList->loadFile(argStrings[0]);
return result; return result;
} else if(subStringMatch(verb, "label")) {
debugger->addLabel(argStrings[0], decipher_arg(argStrings[1]));
return "";
} else { } else {
return "invalid label or address"; return "invalid label or address";
} }

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: EquateList.cxx,v 1.12 2005-06-21 23:01:25 stephena Exp $ // $Id: EquateList.cxx,v 1.13 2005-06-22 20:25:20 urchlay Exp $
//============================================================================ //============================================================================
#include <string> #include <string>
@ -185,16 +185,11 @@ string EquateList::loadFile(string file) {
break; break;
if(buffer[0] != '-') { if(buffer[0] != '-') {
curLabel = getLabel(buffer); curLabel = extractLabel(buffer);
if((curVal = parse4hex(buffer+25)) < 0) if((curVal = extractValue(buffer)) < 0)
return "invalid symbol file"; return "invalid symbol file";
// FIXME - this is a memleak and *must* be fixed addEquate(curLabel, curVal);
// ideally, the Equate class should hold a string, not a char*
Equate e;
e.label = strdup(curLabel.c_str());
e.address = curVal;
ourVcsEquates.push_back(e);
// cerr << "label: " << curLabel << ", address: " << curVal << endl; // cerr << "label: " << curLabel << ", address: " << curVal << endl;
// cerr << buffer; // cerr << buffer;
@ -209,6 +204,16 @@ string EquateList::loadFile(string file) {
return "loaded " + file + " OK"; return "loaded " + file + " OK";
} }
void EquateList::addEquate(string label, int address) {
// FIXME - this is a memleak and *must* be fixed
// ideally, the Equate class should hold a string, not a char*
Equate e;
e.label = strdup(label.c_str());
e.address = address;
ourVcsEquates.push_back(e);
calcSize();
}
int EquateList::parse4hex(char *c) { int EquateList::parse4hex(char *c) {
int ret = 0; int ret = 0;
for(int i=0; i<4; i++) { for(int i=0; i<4; i++) {
@ -224,7 +229,23 @@ int EquateList::parse4hex(char *c) {
return ret; return ret;
} }
string EquateList::getLabel(char *c) { int EquateList::extractValue(char *c) {
while(*c != ' ') {
if(*c == '\0')
return -1;
c++;
}
while(*c == ' ') {
if(*c == '\0')
return -1;
c++;
}
return parse4hex(c);
}
string EquateList::extractLabel(char *c) {
string l = ""; string l = "";
while(*c != ' ') while(*c != ' ')
l += *c++; l += *c++;

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: EquateList.hxx,v 1.6 2005-06-21 18:46:33 stephena Exp $ // $Id: EquateList.hxx,v 1.7 2005-06-22 20:25:20 urchlay Exp $
//============================================================================ //============================================================================
#ifndef EQUATELIST_HXX #ifndef EQUATELIST_HXX
@ -32,13 +32,15 @@ class EquateList {
char *getLabel(int addr); char *getLabel(int addr);
char *getFormatted(int addr, int places); char *getFormatted(int addr, int places);
int getAddress(const char *label); int getAddress(const char *label);
void addEquate(string label, int address);
string loadFile(string file); string loadFile(string file);
void dumpAll(); void dumpAll();
private: private:
int calcSize(); int calcSize();
int parse4hex(char *c); int parse4hex(char *c);
string getLabel(char *c); string extractLabel(char *c);
int extractValue(char *c);
private: private:
Equates ourVcsEquates; Equates ourVcsEquates;