GP-2662 - Paste hex in search memory window

This commit is contained in:
dragonmacher 2022-09-29 19:30:45 -04:00
parent 79e239f690
commit e3ed010914
2 changed files with 24 additions and 24 deletions

View file

@ -580,10 +580,10 @@ class MemSearchDialog extends DialogComponentProvider {
memoryBlockGroup.add(loadedBlocks); memoryBlockGroup.add(loadedBlocks);
memoryBlockGroup.add(allBlocks); memoryBlockGroup.add(allBlocks);
loadedBlocks.setToolTipText(HTMLUtilities.toHTML( loadedBlocks.setToolTipText(HTMLUtilities
"Only searches memory blocks that are loaded in a running executable.\n " + .toHTML("Only searches memory blocks that are loaded in a running executable.\n " +
"Ghidra now includes memory blocks for other data such as section headers.\n" + "Ghidra now includes memory blocks for other data such as section headers.\n" +
"This option exludes these OTHER (non loaded) blocks.")); "This option exludes these OTHER (non loaded) blocks."));
allBlocks.setToolTipText( allBlocks.setToolTipText(
"Searches all memory blocks including blocks that are not actually loaded in a running executable"); "Searches all memory blocks including blocks that are not actually loaded in a running executable");
@ -710,9 +710,9 @@ class MemSearchDialog extends DialogComponentProvider {
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
clearStatusText(); clearStatusText();
// allow pasting numbers in the forms like 0xABC or ABCh // allow pasting numbers in the forms like 0xABC or ABCh
str = removeNumberBasePrefixAndSuffix(str); str = removeNumberBasePrefixAndSuffix(str);
String currentText = getText(0, getLength()); String currentText = getText(0, getLength());
String beforeOffset = currentText.substring(0, offs); String beforeOffset = currentText.substring(0, offs);
String afterOffset = currentText.substring(offs, currentText.length()); String afterOffset = currentText.substring(offs, currentText.length());
@ -791,28 +791,32 @@ class MemSearchDialog extends DialogComponentProvider {
} }
return null; return null;
} }
private String removeNumberBasePrefixAndSuffix(String str) { private String removeNumberBasePrefixAndSuffix(String str) {
if (!(currentFormat instanceof HexSearchFormat || currentFormat instanceof BinarySearchFormat)) { if (!(currentFormat instanceof HexSearchFormat ||
currentFormat instanceof BinarySearchFormat)) {
return str; return str;
} }
String numMaybe = str.strip(); String numMaybe = str.strip();
String lowercase = numMaybe.toLowerCase(); String lowercase = numMaybe.toLowerCase();
if (currentFormat instanceof HexSearchFormat) { if (currentFormat instanceof HexSearchFormat) {
if (lowercase.startsWith("0x")) { if (lowercase.startsWith("0x")) {
numMaybe = numMaybe.substring(2); numMaybe = numMaybe.substring(2);
} else if (lowercase.startsWith("$")) { }
else if (lowercase.startsWith("$")) {
numMaybe = numMaybe.substring(1); numMaybe = numMaybe.substring(1);
} else if (lowercase.endsWith("h")) { }
else if (lowercase.endsWith("h")) {
numMaybe = numMaybe.substring(0, numMaybe.length() - 1); numMaybe = numMaybe.substring(0, numMaybe.length() - 1);
} }
} else { }
else {
if (lowercase.startsWith("0b")) { if (lowercase.startsWith("0b")) {
numMaybe = numMaybe.substring(2); numMaybe = numMaybe.substring(2);
} }
} }
// check if the resultant number looks valid for insertion (i.e. not empty) // check if the resultant number looks valid for insertion (i.e. not empty)
if (!numMaybe.isEmpty()) { if (!numMaybe.isEmpty()) {
return numMaybe; return numMaybe;

View file

@ -15,8 +15,7 @@
*/ */
package ghidra.app.plugin.core.searchmem; package ghidra.app.plugin.core.searchmem;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertNotNull;
import java.awt.Container; import java.awt.Container;
import java.awt.Window; import java.awt.Window;
@ -99,8 +98,7 @@ public class MnemonicSearchPluginTest extends AbstractGhidraHeadedIntegrationTes
performAction(searchMnemonicOperandsNoConstAction, cb.getProvider(), true); performAction(searchMnemonicOperandsNoConstAction, cb.getProvider(), true);
MemSearchDialog dialog = MemSearchDialog dialog = waitForDialogComponent(MemSearchDialog.class);
waitForDialogComponent(tool.getToolFrame(), MemSearchDialog.class, 2000);
assertNotNull(dialog); assertNotNull(dialog);
Container component = dialog.getComponent(); Container component = dialog.getComponent();
@ -121,8 +119,7 @@ public class MnemonicSearchPluginTest extends AbstractGhidraHeadedIntegrationTes
performAction(searchMnemonicNoOperandsNoConstAction, cb.getProvider(), true); performAction(searchMnemonicNoOperandsNoConstAction, cb.getProvider(), true);
MemSearchDialog dialog = MemSearchDialog dialog = waitForDialogComponent(MemSearchDialog.class);
waitForDialogComponent(tool.getToolFrame(), MemSearchDialog.class, 2000);
assertNotNull(dialog); assertNotNull(dialog);
Container component = dialog.getComponent(); Container component = dialog.getComponent();
@ -143,8 +140,7 @@ public class MnemonicSearchPluginTest extends AbstractGhidraHeadedIntegrationTes
performAction(searchMnemonicOperandsConstAction, cb.getProvider(), true); performAction(searchMnemonicOperandsConstAction, cb.getProvider(), true);
MemSearchDialog dialog = MemSearchDialog dialog = waitForDialogComponent(MemSearchDialog.class);
waitForDialogComponent(tool.getToolFrame(), MemSearchDialog.class, 2000);
assertNotNull(dialog); assertNotNull(dialog);
Container component = dialog.getComponent(); Container component = dialog.getComponent();
@ -160,7 +156,7 @@ public class MnemonicSearchPluginTest extends AbstractGhidraHeadedIntegrationTes
/** /**
* Tests that when multiple regions are selected, the user is notified via * Tests that when multiple regions are selected, the user is notified via
* pop-up that this is not acceptable. * pop-up that this is not acceptable.
* *
*/ */
@Test @Test
public void testMultipleSelection() { public void testMultipleSelection() {
@ -178,10 +174,10 @@ public class MnemonicSearchPluginTest extends AbstractGhidraHeadedIntegrationTes
// Now invoke the menu option we want to test. // Now invoke the menu option we want to test.
performAction(searchMnemonicOperandsConstAction, cb.getProvider(), false); performAction(searchMnemonicOperandsConstAction, cb.getProvider(), false);
// Here's the main assert: If the code recognizes that we have multiple selection, the // Here's the main assert: If the code recognizes that we have multiple selection, the
// MemSearchDialog will NOT be displayed (an error message pops up instead). So verify that // MemSearchDialog will NOT be displayed (an error message pops up instead). So verify that
// the dialog is null and we're ok. // the dialog is null and we're ok.
Window errorDialog = waitForWindow("Mnemonic Search Error", 2000); Window errorDialog = waitForWindow("Mnemonic Search Error");
assertNotNull(errorDialog); assertNotNull(errorDialog);
errorDialog.setVisible(false); errorDialog.setVisible(false);
} }