Don't use StringUtilties.toQuotedString.

This commit is contained in:
Alessandro Gatti 2019-11-19 17:21:57 +01:00 committed by dev747368
parent e2354a7976
commit 0c97e44bf7
2 changed files with 39 additions and 12 deletions

View file

@ -18,13 +18,13 @@ package ghidra.program.model.data;
import java.math.BigInteger;
import ghidra.docking.settings.*;
import ghidra.program.model.data.RenderUnicodeSettingsDefinition.RENDER_ENUM;
import ghidra.program.model.mem.ByteMemBufferImpl;
import ghidra.program.model.mem.MemBuffer;
import ghidra.program.model.scalar.Scalar;
import ghidra.util.BigEndianDataConverter;
import ghidra.util.LittleEndianDataConverter;
import ghidra.util.StringFormat;
import ghidra.util.StringUtilities;
/**
* Base type for integer data types such as {@link CharDataType chars}, {@link IntegerDataType ints},
@ -281,17 +281,10 @@ public abstract class AbstractIntegerDataType extends BuiltIn implements ArraySt
}
MemBuffer memBuf = new ByteMemBufferImpl(null, bytes, true);
StringDataInstance instance = new StringDataInstance(this, settings, memBuf, nominalLen);
if (bytes.length == 1) {
return instance.getCharRepresentation();
}
String stringRepresentation = instance.getStringRepresentation();
if (stringRepresentation.length() != nominalLen) {
stringRepresentation = StringUtilities.toQuotedString(bytes);
}
return stringRepresentation;
StringDataInstance instance = new StringDataInstance(this, settings, memBuf,
nominalLen, RENDER_ENUM.ESC_SEQ);
return bytes.length == 1 ? instance.getCharRepresentation() :
instance.getStringRepresentation();
}
String valStr;

View file

@ -205,6 +205,37 @@ public class StringDataInstance {
this.length = length;
}
/**
* Creates a string instance using the data in the {@link MemBuffer} and the settings
* pulled from the {@link AbstractStringDataType string data type} but using the given
* {@link RenderUnicodeSettingsDefinition.RENDER_ENUM rendering setting}.
*
* @param stringDataType {@link AbstractStringDataType} common string base data type.
* @param settings {@link Settings} attached to the data location.
* @param buf {@link MemBuffer} containing the data.
* @param length Length passed from the caller to the datatype. -1 indicates a 'probe'
* trying to detect the length of an unknown string, otherwise it will be the length
* of the containing field of the data instance.
* @param renderSettings How to render the instance contents.
*/
public StringDataInstance(DataType dataType, Settings settings, MemBuffer buf, int length,
RenderUnicodeSettingsDefinition.RENDER_ENUM renderSettings) {
settings = (settings == null) ? SettingsImpl.NO_SETTINGS : settings;
this.buf = buf;
this.charsetName = getCharsetNameFromDataTypeOrSettings(dataType, settings);
this.charSize = CharsetInfo.getInstance().getCharsetCharSize(charsetName);
// NOTE: for now only handle padding for charSize == 1
this.paddedCharSize =
charSize == 1 ? getDataOrganization(dataType).getCharSize() : charSize;
this.stringLayout = getLayoutFromDataType(dataType);
this.showTranslation = TRANSLATION.isShowTranslated(settings);
this.translatedValue = TRANSLATION.getTranslatedValue(settings);
this.renderSetting = renderSettings;
this.endianSetting = ENDIAN.getEndianess(settings, null);
this.length = length;
}
private StringDataInstance(StringDataInstance copyFrom, StringLayoutEnum newLayout,
MemBuffer newBuf, int newLen) {
this.charSize = copyFrom.charSize;
@ -234,6 +265,9 @@ public class StringDataInstance {
if (dataType instanceof AbstractStringDataType) {
return ((AbstractStringDataType) dataType).getStringLayout();
}
if (dataType instanceof AbstractIntegerDataType) {
return StringLayoutEnum.FIXED_LEN;
}
return StringLayoutEnum.NULL_TERMINATED_BOUNDED;
}