blob: 9e79fba74921066c31822e7b18181614b906e97a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.debug.internal.ui.views.memory.renderings;
import java.math.BigInteger;
import org.eclipse.debug.core.model.MemoryByte;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.ui.IDebugUIConstants;
/**
*
* Represent a signed integer rendering.
*/
public class SignedIntegerRendering extends AbstractIntegerRendering {
private int fColSize;
private BigInteger fMax;
private BigInteger fMin;
/**
* @param memBlock
* @param renderingId
*/
public SignedIntegerRendering(String renderingId) {
super(renderingId);
}
private String convertToString(byte[] byteArray, int columnSize, int endianess)
{
String ret;
long result = 0;
if (columnSize == 1)
{
result = byteArray[0];
}
else if (columnSize == 2)
{
result = RenderingsUtil.convertByteArrayToShort(byteArray, endianess);
}
else if (columnSize == 4)
{
result = RenderingsUtil.convertByteArrayToInt(byteArray, endianess);
}
else if (columnSize == 8)
{
result = RenderingsUtil.convertByteArrayToLong(byteArray, endianess);
}
else if (columnSize == 16)
{
BigInteger bigRet = RenderingsUtil.convertByteArrayToSignedBigInt(byteArray, endianess);
return bigRet.toString();
}
else
{
BigInteger bigRet = RenderingsUtil.convertByteArrayToSignedBigInt(byteArray, endianess, columnSize);
return bigRet.toString();
}
ret = new Long(result).toString();
return ret;
}
private byte[] convertToBytes(int colSize, String newValue, int endianess)
{
try {
byte[] bytes;
if (colSize == 1)
{
byte x = Byte.parseByte(newValue);
bytes = new byte[1];
bytes[0] = x;
}
else if (colSize == 2)
{
short i = Short.parseShort(newValue);
bytes = RenderingsUtil.convertShortToByteArray(i, endianess);
}
else if (colSize == 4)
{
int i = Integer.parseInt(newValue);
bytes = RenderingsUtil.convertIntToByteArray(i, endianess);
}
else if (colSize == 8)
{
long i = Long.parseLong(newValue);
bytes = RenderingsUtil.convertLongToByteArray(i, endianess);
}
else if (colSize == 16)
{
// special case for colSize == 16
// need to represent number in Big Integer
BigInteger i = new BigInteger(newValue);
bytes = RenderingsUtil.convertBigIntegerToByteArray(i, endianess);
return bytes;
}
else
{
BigInteger i = new BigInteger(newValue);
// avoid calculating max and min over and over again
// for the same column size
if (fColSize != colSize)
{
fColSize = colSize;
fMax = BigInteger.valueOf(2);
fMax = fMax.pow(colSize*8-1);
fMin = fMax.multiply(BigInteger.valueOf(-1));
fMax = fMax.subtract(BigInteger.valueOf(1));
}
if (i.compareTo(fMax) > 0 || i.compareTo(fMin) < 0)
throw new NumberFormatException();
bytes = RenderingsUtil.convertSignedBigIntToByteArray(i, endianess, colSize);
return bytes;
}
return bytes;
} catch (NumberFormatException e) {
throw e;
}
}
/* (non-Javadoc)
* @see com.ibm.debug.extended.ui.AbstractMemoryRenderer#getString(java.lang.String, java.math.BigInteger, byte[])
*/
public String getString(String dataType, BigInteger address, MemoryByte[] data) {
boolean invalid = false;
String paddedStr = DebugUIPlugin.getDefault().getPreferenceStore().getString(IDebugUIConstants.PREF_PADDED_STR);
for (int i=0; i<data.length; i++)
{
if (!data[i].isReadable())
{
invalid = true;
break;
}
}
if (invalid)
{
StringBuffer strBuf = new StringBuffer();
for (int i=0; i<data.length; i++)
{
strBuf.append(paddedStr);
}
return strBuf.toString();
}
int columnSize = getBytesPerColumn();
// if the user has not set an endianess to the rendering
// take default endianess from bytes
int endianess = getDisplayEndianess();
if (endianess == RenderingsUtil.ENDIANESS_UNKNOWN)
endianess = getBytesEndianess(data);
byte[] byteArray = new byte[data.length];
for (int i=0; i<byteArray.length;i ++)
{
byteArray[i] = data[i].getValue();
}
// if endianess is unknown, do not render, just return padded string
if (RenderingsUtil.ENDIANESS_UNKNOWN == endianess)
{
StringBuffer strBuf = new StringBuffer();
for (int i=0; i<byteArray.length; i++)
{
strBuf.append(paddedStr);
}
return strBuf.toString();
}
return convertToString(byteArray, columnSize, endianess);
}
/* (non-Javadoc)
* @see com.ibm.debug.extended.ui.AbstractMemoryRenderer#getBytes(java.lang.String, java.math.BigInteger, java.lang.String)
*/
public byte[] getBytes(String dataType, BigInteger address, MemoryByte[] currentValues, String data) {
int columnSize = getBytesPerColumn();
// if the user has not set an endianess to the rendering
// take default
int endianess = getDisplayEndianess();
if (endianess == RenderingsUtil.ENDIANESS_UNKNOWN)
endianess = getBytesEndianess(currentValues);
// if endianess is unknown, do not try to render new data to bytes
if (endianess == RenderingsUtil.ENDIANESS_UNKNOWN)
{
byte[] retBytes = new byte[currentValues.length];
for (int i=0 ;i<currentValues.length; i++)
retBytes[i] = currentValues[i].getValue();
return retBytes;
}
return convertToBytes(columnSize, data, endianess);
}
}