From 09e8e9ce64f2d38c881102ac7e0f9cc8ee03ff9b Mon Sep 17 00:00:00 2001 From: dev747368 <48332326+dev747368@users.noreply.github.com> Date: Wed, 3 Apr 2024 18:01:02 +0000 Subject: [PATCH] GP-3847 change string labels to use translated value if present If label contains non-latin characters that were elided, add a summary of the alphabets/scripts that the non-latin characters were from (eg. s_SCRIPT1_SCRIPT2#normal_latin_chars_0090210) --- .../model/data/StringDataInstance.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StringDataInstance.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StringDataInstance.java index 51e0095fe6..5994f07b63 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StringDataInstance.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StringDataInstance.java @@ -20,6 +20,7 @@ import static ghidra.program.model.data.RenderUnicodeSettingsDefinition.*; import static ghidra.program.model.data.StringLayoutEnum.*; import static ghidra.program.model.data.TranslationSettingsDefinition.*; +import java.lang.Character.UnicodeScript; import java.nio.*; import java.nio.charset.*; import java.util.*; @@ -212,24 +213,37 @@ public class StringDataInstance { public static String makeStringLabel(String prefixStr, String str, DataTypeDisplayOptions options) { boolean needsUnderscore = false; + Set foundScripts = EnumSet.noneOf(UnicodeScript.class); StringBuilder buffer = new StringBuilder(); for (int i = 0, strLength = str.length(); i < strLength && buffer.length() < options.getLabelStringLength();) { int codePoint = str.codePointAt(i); if (StringUtilities.isDisplayable(codePoint) && (codePoint != ' ')) { if (needsUnderscore) { - buffer.append('_'); + if (!buffer.isEmpty()) { + buffer.append('_'); + } needsUnderscore = false; } buffer.appendCodePoint(codePoint); } else { + foundScripts.add(UnicodeScript.of(codePoint)); needsUnderscore = true; // discard character } i += Character.charCount(codePoint); } - return prefixStr + buffer.toString(); + foundScripts.removeAll(Set.of(UnicodeScript.LATIN, UnicodeScript.COMMON)); + String scriptSummary = ""; + if (!foundScripts.isEmpty()) { + List scriptNames = new ArrayList<>(); + foundScripts.forEach(script -> scriptNames.add(script.name())); + Collections.sort(scriptNames); + scriptSummary = String.join("_", scriptNames) + "#"; + } + + return prefixStr + scriptSummary + buffer.toString(); } //----------------------------------------------------------------------------- @@ -948,7 +962,8 @@ public class StringDataInstance { return abbrevPrefixStr; } - String str = getStringValue(); + String str = + showTranslation && translatedValue != null ? translatedValue : getStringValue(); if (str == null) { return defaultStr; }