/************************************************************************
* xref.cpp *
* *
* class to maintain xref list - xref items consist simply of an address *
* which is the location being referenced and a ref_by address which is *
* where the reference is from. It is ordered by location and then by *
* ref_by. *
************************************************************************/
// include files
#include <windows.h>
#include "xref.h"
#include "schedule.h"
#include "dasm.h"
#include "disasm.h"
#include "data.h"
#include "debug.h"
//#include "mainwind.h"
/************************************************************************
* constructor - now empty *
************************************************************************/
xref::xref() {}
/************************************************************************
* destructor - nothing is done here, the item can simply be freed *
************************************************************************/
xref::~xref() {}
/************************************************************************
* basic function which adds an xref to the current list. *
* - just need loc=location for which to create an xref *
* - and ref_by=where it is being referenced from *
* after the xref has been added we still need to add a line *
* to the disassembly and so a task to do this is added using *
* the scheduler. *
************************************************************************/
void xref::addxref(lptr loc,lptr ref_by) {
xrefitem *newxref,*chk;
dsegitem *chkseg;
chkseg=dta->findseg(loc);
if (!chkseg) return;
newxref=new xrefitem;
newxref->addr=loc;
newxref->refby=ref_by;
chk=find(newxref);
if (chk && !compare(newxref,chk)) {
delete newxref;
return;
}
addto(newxref);
scheduler.addtask(dis_xref,priority_xref,loc,NULL);
}
/************************************************************************
* compare function for list - uses address/referencing address *
* to sort list *
************************************************************************/
int xref::compare(xrefitem *i,xrefitem *j) {
if(i->addr <j->addr) return -1;
if(i->addr >j->addr) return 1;
if(i->refby<j->refby) return -1;
if(i->refby>j->refby) return 1;
return 0;
}
/************************************************************************
* function to delete an xref from the list *
* after the xref has been deleted we check if we need to *
* delete anything from the disassembly as well if there are *
* no xrefs left for that loc *
* does a window update if deleting one, but not the comment, which *
* ensures that the number of xrefs is changed *
************************************************************************/
void xref::delxref(lptr loc,lptr ref_by)
{ xrefitem xtmp,*xfind;
xtmp.addr=loc;
xtmp.refby=ref_by;
xfind=find(&xtmp);
if(xfind!=NULL)
if((xfind->addr==loc)&&(xfind->refby==ref_by))
{ delfrom(xfind);
xtmp.refby=nlptr;
xfind=findnext(&xtmp);
if(xfind!=NULL)
if(xfind->addr==loc)
{ cvd->updatewindowifinrange(loc);
return;
}
dsm->delcomment(loc,dsmxref);
}
}
/************************************************************************
* prints the first xref for a given loc *
************************************************************************/
void xref::printfirst(lptr loc){
dword numents=0;
xrefitem findit,*chk;
findit.addr=loc;
findit.refby=nlptr;
findnext(&findit);
chk=nextiterator();
if (!chk) return;
cvd->LastPrintBuff(options.mode32?"%04x:%08x":"%04x:%04x",
chk->refby.segm,chk->refby.offs);
while (chk) {
if (chk->addr==loc) {
chk=nextiterator();
numents++;
}else break;
}
cvd->LastPrintBuff(" Number : %ld",numents);
}
/************************************************************************
* userdel *
* - deletes an xref, using the users current line and the refby passed *
* from the scheduler, which is from the xref viewer dialog *
************************************************************************/
void xref::userdel(lptr loc) {
lptr xcur;
cvd->findcurrentaddr(&xcur);
delxref(xcur,loc);
}
Detected encoding: ASCII (7 bit) | 2
|