1
0
Fork 0

DBG: introduce temp labels

This commit is contained in:
mrexodia 2017-08-09 02:31:44 +02:00
parent 5cb7917630
commit f97439c9f5
No known key found for this signature in database
GPG Key ID: FC89E0AAA0C1AAD8
3 changed files with 55 additions and 23 deletions

View File

@ -159,29 +159,26 @@ bool cbInstrLabelList(int argc, char* argv[])
GuiReferenceAddColumn(0, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Label")));
GuiReferenceSetRowCount(0);
GuiReferenceReloadData();
size_t cbsize;
LabelEnum(0, &cbsize);
if(!cbsize)
std::vector<LABELSINFO> labels;
LabelGetList(labels);
if(labels.empty())
{
dputs(QT_TRANSLATE_NOOP("DBG", "No labels"));
return true;
}
Memory<LABELSINFO*> labels(cbsize, "cbInstrLabelList:labels");
LabelEnum(labels(), 0);
int count = (int)(cbsize / sizeof(LABELSINFO));
for(int i = 0; i < count; i++)
for(size_t i = 0; i < labels.size(); i++)
{
GuiReferenceSetRowCount(i + 1);
char addrText[20] = "";
sprintf_s(addrText, "%p", labels()[i].addr);
sprintf_s(addrText, "%p", labels[i].addr);
GuiReferenceSetCellContent(i, 0, addrText);
char disassembly[GUI_MAX_DISASSEMBLY_SIZE] = "";
if(GuiGetDisassembly(labels()[i].addr, disassembly))
if(GuiGetDisassembly(labels[i].addr, disassembly))
GuiReferenceSetCellContent(i, 1, disassembly);
GuiReferenceSetCellContent(i, 2, labels()[i].text.c_str());
GuiReferenceSetCellContent(i, 2, labels[i].text.c_str());
}
varset("$result", count, false);
dprintf(QT_TRANSLATE_NOOP("DBG", "%d label(s) listed in Reference View\n"), count);
varset("$result", labels.size(), false);
dprintf(QT_TRANSLATE_NOOP("DBG", "%d label(s) listed in Reference View\n"), labels.size());
GuiReferenceReloadData();
return true;
}

View File

@ -25,8 +25,9 @@ struct Labels : AddrInfoHashMap<LockLabels, LABELSINFO, LabelSerializer>
};
static Labels labels;
static std::unordered_map<duint, std::string> tempLabels;
bool LabelSet(duint Address, const char* Text, bool Manual)
bool LabelSet(duint Address, const char* Text, bool Manual, bool Temp)
{
// Make sure the string is supplied, within bounds, and not a special delimiter
if(!Text || Text[0] == '\1' || strlen(Text) >= MAX_LABEL_SIZE - 1 || strstr(Text, "&"))
@ -37,6 +38,11 @@ bool LabelSet(duint Address, const char* Text, bool Manual)
LabelDelete(Address);
return true;
}
if(Temp)
{
tempLabels[Address] = Text;
return true;
}
// Fill in the structure + add to database
LABELSINFO label;
if(!labels.PrepareValue(label, Address, Manual))
@ -47,7 +53,7 @@ bool LabelSet(duint Address, const char* Text, bool Manual)
bool LabelFromString(const char* Text, duint* Address)
{
return labels.GetWhere([&](const LABELSINFO & value)
auto found = labels.GetWhere([&](const LABELSINFO & value)
{
if(strcmp(value.text.c_str(), Text))
return false;
@ -55,13 +61,31 @@ bool LabelFromString(const char* Text, duint* Address)
*Address = value.addr + ModBaseFromName(value.mod().c_str());
return true;
});
if(!found)
{
for(auto & label : tempLabels)
if(strcmp(label.second.c_str(), Text) == 0)
{
if(Address)
*Address = label.first;
return true;
}
}
return found;
}
bool LabelGet(duint Address, char* Text)
{
LABELSINFO label;
if(!labels.Get(Labels::VaKey(Address), label))
return false;
{
auto found = tempLabels.find(Address);
if(found == tempLabels.end())
return false;
if(Text)
strcpy_s(Text, MAX_LABEL_SIZE, found->second.c_str());
return true;
}
if(Text)
strcpy_s(Text, MAX_LABEL_SIZE, label.text.c_str());
return true;
@ -69,12 +93,18 @@ bool LabelGet(duint Address, char* Text)
bool LabelDelete(duint Address)
{
return labels.Delete(Labels::VaKey(Address));
return labels.Delete(Labels::VaKey(Address)) || tempLabels.erase(Address) > 0;
}
void LabelDelRange(duint Start, duint End, bool Manual)
{
labels.DeleteRange(Start, End, Manual);
if(Start == 0 && End == ~0)
tempLabels.clear();
else
for(auto it = tempLabels.begin(); it != tempLabels.end(); ++it)
if(it->first >= Start && it->first < End)
it = tempLabels.erase(it);
}
void LabelCacheSave(JSON Root)
@ -88,19 +118,25 @@ void LabelCacheLoad(JSON Root)
labels.CacheLoad(Root, "auto"); //legacy support
}
bool LabelEnum(LABELSINFO* List, size_t* Size)
{
return labels.Enum(List, Size);
}
void LabelClear()
{
labels.Clear();
tempLabels.clear();
}
void LabelGetList(std::vector<LABELSINFO> & list)
{
labels.GetList(list);
list.reserve(list.size() + tempLabels.size());
for(auto & label : tempLabels)
{
LABELSINFO info;
info.modhash = ModHashFromAddr(label.first);
info.addr = label.first;
info.manual = false;
info.text = label.second;
list.push_back(info);
}
}
bool LabelGetInfo(duint Address, LABELSINFO* info)

View File

@ -9,14 +9,13 @@ struct LABELSINFO : AddrInfo
std::string text;
};
bool LabelSet(duint Address, const char* Text, bool Manual);
bool LabelSet(duint Address, const char* Text, bool Manual, bool Temp = false);
bool LabelFromString(const char* Text, duint* Address);
bool LabelGet(duint Address, char* Text);
bool LabelDelete(duint Address);
void LabelDelRange(duint Start, duint End, bool Manual);
void LabelCacheSave(JSON root);
void LabelCacheLoad(JSON root);
bool LabelEnum(LABELSINFO* List, size_t* Size);
void LabelClear();
void LabelGetList(std::vector<LABELSINFO> & list);
bool LabelGetInfo(duint Address, LABELSINFO* info);