Merge remote-tracking branch 'origin/GP-3772_dev747368_string_xlat_auto_eol_comment'

This commit is contained in:
Ryan Kurtz 2023-09-14 10:52:06 -04:00
commit 4bd74e2f94
2 changed files with 55 additions and 11 deletions

View file

@ -183,6 +183,10 @@ public class DisplayableEol {
} }
private String[] getPreviewForNoReferences() { private String[] getPreviewForNoReferences() {
String translatedStringValue = getPreviewForString();
if (translatedStringValue != null) {
return new String[] { translatedStringValue };
}
String undefinedPointerText = getUndefinedPointer(codeUnit); String undefinedPointerText = getUndefinedPointer(codeUnit);
if (undefinedPointerText != null) { if (undefinedPointerText != null) {
return new String[] { undefinedPointerText }; return new String[] { undefinedPointerText };
@ -190,6 +194,17 @@ public class DisplayableEol {
return new String[0]; return new String[0];
} }
private String getPreviewForString() {
if (codeUnit instanceof Data data && StringDataInstance.isString(data)) {
StringDataInstance sdi = StringDataInstance.getStringDataInstance(data);
if (sdi.hasTranslatedValue()) {
// show the opposite value
return sdi.getStringRepresentation(sdi.isShowTranslation());
}
}
return null;
}
private boolean isValidReference(Program program, Reference reference) { private boolean isValidReference(Program program, Reference reference) {
if (!reference.isMemoryReference()) { if (!reference.isMemoryReference()) {

View file

@ -15,15 +15,14 @@
*/ */
package ghidra.program.model.data; package ghidra.program.model.data;
import static ghidra.program.model.data.EndianSettingsDefinition.ENDIAN; import static ghidra.program.model.data.EndianSettingsDefinition.*;
import static ghidra.program.model.data.RenderUnicodeSettingsDefinition.RENDER; import static ghidra.program.model.data.RenderUnicodeSettingsDefinition.*;
import static ghidra.program.model.data.StringLayoutEnum.*; import static ghidra.program.model.data.StringLayoutEnum.*;
import static ghidra.program.model.data.TranslationSettingsDefinition.TRANSLATION; import static ghidra.program.model.data.TranslationSettingsDefinition.*;
import java.util.*;
import java.nio.*; import java.nio.*;
import java.nio.charset.*; import java.nio.charset.*;
import java.util.*;
import generic.stl.Pair; import generic.stl.Pair;
import ghidra.docking.settings.*; import ghidra.docking.settings.*;
@ -759,10 +758,33 @@ public class StringDataInstance {
* <p> * <p>
* Example (quotes are part of result): {@code "Test\tstring",01,02,"Second\npart",00} * Example (quotes are part of result): {@code "Test\tstring",01,02,"Second\npart",00}
* *
* @return formatted String * @return formatted String, or the translated value if present and the "show translated"
* setting is enabled for this string's location
*/ */
public String getStringRepresentation() { public String getStringRepresentation() {
return getStringRep(StringRenderBuilder.DOUBLE_QUOTE, StringRenderBuilder.DOUBLE_QUOTE); return showTranslation && translatedValue != null
? getTranslatedStringRepresentation(translatedValue)
: getStringRep(StringRenderBuilder.DOUBLE_QUOTE, StringRenderBuilder.DOUBLE_QUOTE);
}
/**
* Returns a formatted version of the string returned by {@link #getStringValue()}.
* <p>
* The resulting string will be formatted with quotes around the parts that contain plain ASCII
* alpha characters (and simple escape sequences), and out-of-range byte-ish values listed as
* comma separated hex-encoded values:
* <p>
* Example (quotes are part of result): {@code "Test\tstring",01,02,"Second\npart",00}
*
* @param originalOrTranslated boolean flag, if true returns the representation of the
* string value, if false returns the representation of the translated value
* @return formatted String
*/
public String getStringRepresentation(boolean originalOrTranslated) {
return originalOrTranslated
? getStringRep(StringRenderBuilder.DOUBLE_QUOTE, StringRenderBuilder.DOUBLE_QUOTE)
: translatedValue != null ? getTranslatedStringRepresentation(translatedValue)
: UNKNOWN;
} }
private String getStringRep(char quoteChar, char quoteCharMulti) { private String getStringRep(char quoteChar, char quoteCharMulti) {
@ -771,10 +793,6 @@ public class StringDataInstance {
return UNKNOWN; return UNKNOWN;
} }
if (showTranslation && translatedValue != null) {
return getTranslatedStringRepresentation(translatedValue);
}
byte[] stringBytes = convertPaddedToUnpadded(getStringBytes()); byte[] stringBytes = convertPaddedToUnpadded(getStringBytes());
if (stringBytes == null) { if (stringBytes == null) {
return UNKNOWN_DOT_DOT_DOT; return UNKNOWN_DOT_DOT_DOT;
@ -911,6 +929,17 @@ public class StringDataInstance {
return s.substring(0, lastGoodChar + 1); return s.substring(0, lastGoodChar + 1);
} }
/**
* Returns true if this string has a translated value that could
* be displayed.
*
* @return boolean true if translated value is present, false if no
* value is present
*/
public boolean hasTranslatedValue() {
return translatedValue != null;
}
/** /**
* Returns the value of the stored * Returns the value of the stored
* {@link TranslationSettingsDefinition#getTranslatedValue(Data) translated settings} * {@link TranslationSettingsDefinition#getTranslatedValue(Data) translated settings}