This commit is contained in:
xarkes 2017-11-26 17:53:05 +01:00
parent 2a7981a36a
commit 9d242f1fa9
4 changed files with 60 additions and 23 deletions

View File

@ -22,12 +22,12 @@ void RenameDialog::on_buttonBox_rejected()
close();
}
void RenameDialog::setFunctionName(QString fcnName)
void RenameDialog::setName(QString fcnName)
{
ui->nameEdit->setText(fcnName);
}
QString RenameDialog::getFunctionName() const
QString RenameDialog::getName() const
{
return ui->nameEdit->text();
}

View File

@ -17,8 +17,8 @@ public:
explicit RenameDialog(QWidget *parent = 0);
~RenameDialog();
void setFunctionName(QString fcnName);
QString getFunctionName() const;
void setName(QString fcnName);
QString getName() const;
private slots:
void on_buttonBox_accepted();

View File

@ -36,7 +36,7 @@ QKeySequence DisassemblyContextMenu::getAddFlagSequence() const
QKeySequence DisassemblyContextMenu::getRenameSequence() const
{
return {}; //TODO insert correct sequence
return {Qt::Key_N};
}
QKeySequence DisassemblyContextMenu::getXRefSequence() const
@ -129,25 +129,62 @@ void DisassemblyContextMenu::on_actionAddFlag_triggered()
void DisassemblyContextMenu::on_actionRename_triggered()
{
// Get function for clicked offset
RAnalFunction *fcn = CutterCore::getInstance()->functionAt(offset);
if( nullptr == fcn )
{
return;
}
ut64 tgt_addr = UT64_MAX;
RAnalOp op;
RCore *core = Core()->core();
RenameDialog *dialog = new RenameDialog(this);
// Get function based on click position
dialog->setFunctionName(fcn->name);
if (dialog->exec())
{
// Get new function name
QString new_name = dialog->getFunctionName();
// Rename function in r2 core
CutterCore::getInstance()->renameFunction(fcn->name, new_name);
// Seek to new renamed function
CutterCore::getInstance()->seek(fcn->addr);
r_anal_op(core->anal, &op, offset, core->block, 32);
tgt_addr = op.jump != UT64_MAX ? op.jump : op.ptr;
if (op.var) {
RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, offset, 0);
if (fcn) {
RAnalVar *bar = r_anal_var_get_byname (core->anal, fcn, op.var->name);
if (!bar) {
bar = r_anal_var_get_byname (core->anal, fcn, op.var->name);
if (!bar) {
bar = r_anal_var_get_byname (core->anal, fcn, op.var->name);
}
}
if (bar) {
dialog->setName(bar->name);
if (dialog->exec()) {
QString new_name = dialog->getName();
r_anal_var_rename (core->anal, fcn->addr, bar->scope,
bar->kind, bar->name, new_name.toStdString().c_str());
}
}
}
} else if (tgt_addr != UT64_MAX) {
RAnalFunction *fcn = r_anal_get_fcn_at (core->anal, tgt_addr, R_ANAL_FCN_TYPE_NULL);
RFlagItem *f = r_flag_get_i (core->flags, tgt_addr);
if (fcn) {
/* Rename function */
dialog->setName(fcn->name);
if (dialog->exec()) {
QString new_name = dialog->getName();
Core()->renameFunction(fcn->name, new_name);
}
} else if (f) {
/* Rename current flag */
dialog->setName(f->name);
if (dialog->exec()) {
QString new_name = dialog->getName();
Core()->renameFunction(f->name, new_name);
}
} else {
/* Create new flag */
dialog->setName("");
if (dialog->exec()) {
QString new_name = dialog->getName();
Core()->addFlag(tgt_addr, new_name, 1);
}
}
}
r_anal_op_fini (&op);
emit Core()->commentsChanged();
}
void DisassemblyContextMenu::on_actionXRefs_triggered()

View File

@ -468,12 +468,12 @@ void FunctionsWidget::on_actionFunctionsRename_triggered()
RenameDialog *r = new RenameDialog(this);
// Set function name in dialog
r->setFunctionName(function.name);
r->setName(function.name);
// If user accepted
if (r->exec())
{
// Get new function name
QString new_name = r->getFunctionName();
QString new_name = r->getName();
// Rename function in r2 core
CutterCore::getInstance()->renameFunction(function.name, new_name);