DBG: introduce temp labels
This commit is contained in:
parent
5cb7917630
commit
f97439c9f5
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue