1
0
Fork 0
x64dbg/src/dbg/comment.cpp

100 lines
2.3 KiB
C++

#include "comment.h"
struct CommentSerializer : AddrInfoSerializer<COMMENTSINFO>
{
bool Save(const COMMENTSINFO & value) override
{
AddrInfoSerializer::Save(value);
setString("text", value.text);
return true;
}
bool Load(COMMENTSINFO & value) override
{
return AddrInfoSerializer::Load(value) &&
getString("text", value.text);
}
};
struct Comments : AddrInfoHashMap<LockComments, COMMENTSINFO, CommentSerializer>
{
const char* jsonKey() const override
{
return "comments";
}
};
static Comments comments;
bool CommentSet(duint Address, const char* Text, bool Manual)
{
// Make sure the string is supplied, within bounds, and not a special delimiter
if(!Text || Text[0] == '\1' || strlen(Text) >= MAX_COMMENT_SIZE - 1)
return false;
// Delete the comment if no text was supplied
if(Text[0] == '\0')
{
CommentDelete(Address);
return true;
}
// Fill in the structure + add to database
COMMENTSINFO comment;
if(!comments.PrepareValue(comment, Address, Manual))
return false;
strcpy_s(comment.text, Text);
return comments.Add(comment);
}
bool CommentGet(duint Address, char* Text)
{
COMMENTSINFO comment;
if(!comments.Get(Comments::VaKey(Address), comment))
return false;
if(comment.manual)
strcpy_s(Text, MAX_COMMENT_SIZE, comment.text);
else
sprintf_s(Text, MAX_COMMENT_SIZE, "\1%s", comment.text);
return true;
}
bool CommentDelete(duint Address)
{
return comments.Delete(Comments::VaKey(Address));
}
void CommentDelRange(duint Start, duint End, bool Manual)
{
comments.DeleteRange(Start, End, Manual);
}
void CommentCacheSave(JSON Root)
{
comments.CacheSave(Root);
}
void CommentCacheLoad(JSON Root)
{
comments.CacheLoad(Root);
comments.CacheLoad(Root, "auto"); //legacy support
}
bool CommentEnum(COMMENTSINFO* List, size_t* Size)
{
return comments.Enum(List, Size);
}
void CommentClear()
{
comments.Clear();
}
void CommentGetList(std::vector<COMMENTSINFO> & list)
{
comments.GetList(list);
}
bool CommentGetInfo(duint Address, COMMENTSINFO* info)
{
return comments.GetInfo(Comments::VaKey(Address), info);
}