def _event(cls):
while True:
# cmt_changing event
ea,rpt,new = (yield)
old = idaapi.get_cmt(ea, rpt)
f,o,n = idaapi.get_func(ea),internal.comment.decode(old),internal.comment.decode(new)
# update references before we update the comment
cls._update_refs(ea, o, n)
# wait for cmt_changed event
newea,nrpt,none = (yield)
# now fix the comment the user typed
if (newea,nrpt,none) == (ea,rpt,None):
ncmt,repeatable = idaapi.get_cmt(ea, rpt), cls._is_repeatable(ea)
if (ncmt or '') != new:
logging.warn("internal.{:s}.event : Comment from event is different from database : {:x} : {!r} != {!r}".format('.'.join((__name__,cls.__name__)), ea, new, ncmt))
# delete it if it's the wrong type
# if nrpt != repeatable:
# idaapi.set_cmt(ea, '', nrpt)
# # write the tag back to the address
# if internal.comment.check(new): idaapi.set_cmt(ea, internal.comment.encode(n), repeatable)
# # write the comment back if it's non-empty
# elif new: idaapi.set_cmt(ea, new, repeatable)
# # otherwise, remove it's reference since it's being deleted
# else: cls._delete_refs(ea, n)
if internal.comment.check(new): idaapi.set_cmt(ea, internal.comment.encode(n), rpt)
elif new: idaapi.set_cmt(ea, new, rpt)
else: cls._delete_refs(ea, n)
continue
# if the changed event doesn't happen in the right order
logging.fatal("{:s}.event : Comment events are out of sync, updating tags from previous comment. : {!r} : {!r}".format('.'.join((__name__,cls.__name__)), o, n))
# delete the old comment
cls._delete_refs(ea, o)
idaapi.set_cmt(ea, '', rpt)
logging.warn("{:s}.event : Previous comment at {:x} : {!r}".format('.'.join((__name__,cls.__name__)), o))
# new comment
new = idaapi.get_cmt(newea, nrpt)
n = internal.comment.decode(new)
cls._create_refs(newea, n)
continue
return
评论列表
文章目录