diff options
7 files changed, 222 insertions, 84 deletions
diff --git a/org.eclipse.debug.ui/plugin.properties b/org.eclipse.debug.ui/plugin.properties index 092c4562a..861da32bd 100644 --- a/org.eclipse.debug.ui/plugin.properties +++ b/org.eclipse.debug.ui/plugin.properties @@ -288,6 +288,7 @@ Endianess = Endianess BigEndianActionName = Big Endian LittleEndianActionName = Little Endian RestoreDefEndianessActionName = Restore Default +HexIntegerName = Hex Integer ViewManagementAction.label=&View Management... diff --git a/org.eclipse.debug.ui/plugin.xml b/org.eclipse.debug.ui/plugin.xml index ad5656ecf..1eb56d343 100644 --- a/org.eclipse.debug.ui/plugin.xml +++ b/org.eclipse.debug.ui/plugin.xml @@ -2199,6 +2199,11 @@ M4 = Platform-specific fourth key class="org.eclipse.debug.internal.ui.views.memory.renderings.UnsignedIntegerRenderingTypeDelegate" name="%UnsignedIntegerName" id="org.eclipse.debug.ui.rendering.unsignedint"/> + <renderingType + class="org.eclipse.debug.internal.ui.views.memory.renderings.HexIntegerRenderingDelegate" + id="org.eclipse.debug.ui.rendering.hexint" + name="%HexIntegerName"> + </renderingType> </extension> <extension point="org.eclipse.ui.workingSets"> diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexIntegerRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexIntegerRendering.java new file mode 100644 index 000000000..07242208b --- /dev/null +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexIntegerRendering.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * Copyright (c) 2007 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 + * David Pickens - [Memory View] Endian in hex view and ASCII view doesn't work + *******************************************************************************/ +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; + +/** + * @since 3.3 + */ +public class HexIntegerRendering extends AbstractIntegerRendering { + + public HexIntegerRendering(String renderingId) + { + super(renderingId); + } + + /* (non-Javadoc) + * @see org.eclipse.debug.internal.ui.views.memory.AbstractTableRendering#getString(java.lang.String, java.math.BigInteger, org.eclipse.debug.core.model.MemoryByte[], java.lang.String) + */ + public String getString(String dataType, BigInteger address, + MemoryByte[] data) { + StringBuffer strBuffer = new StringBuffer(); + int endianess = getEndianness(data); + + String paddedStr = DebugUIPlugin.getDefault().getPreferenceStore().getString(IDebugUIConstants.PREF_PADDED_STR); + + if (endianess == RenderingsUtil.LITTLE_ENDIAN) { + MemoryByte[] swapped = new MemoryByte[data.length]; + for (int i = 0; i < data.length; i++){ + swapped[data.length-i-1] = data[i]; + } + data = swapped; + } + + for (int i=0; i<data.length; i++) + { + if (data[i].isReadable()) + { + strBuffer.append(new String(RenderingsUtil.convertByteToCharArray(data[i].getValue()))); + } + else + { + // pad with padded string + strBuffer.append(paddedStr); + } + } + + return strBuffer.toString().toUpperCase(); + } + + /** + * @todo davidp needs to add a method comment. + * @param data + * @return + */ + private int getEndianness (MemoryByte[] data) { + // if the user has not set an endianess to the rendering + // take default + int endianess = getDisplayEndianess(); + if (endianess == RenderingsUtil.ENDIANESS_UNKNOWN) + endianess = getBytesEndianess(data); + return endianess; + } + + /* (non-Javadoc) + * @see org.eclipse.debug.internal.ui.views.memory.AbstractTableRendering#getBytes(java.lang.String, java.math.BigInteger, org.eclipse.debug.core.model.MemoryByte[], java.lang.String) + */ + public byte[] getBytes(String dataType, BigInteger address, + MemoryByte[] currentValues, String data) { + + int endianess = getEndianness(currentValues); + byte[] bytes = RenderingsUtil.convertHexStringToByteArray(data, currentValues.length, getNumCharsPerByte()); + + + if (endianess == RenderingsUtil.LITTLE_ENDIAN) { + byte[] swapped = new byte[bytes.length]; + for (int i = 0; i < bytes.length; i++){ + swapped[bytes.length-i-1] = bytes[i]; + } + bytes = swapped; + } + + return bytes; + } + + public int getNumCharsPerByte() + { + return 2; + } + + +} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexIntegerRenderingDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexIntegerRenderingDelegate.java new file mode 100644 index 000000000..8ccbde884 --- /dev/null +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexIntegerRenderingDelegate.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2007 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 org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.ui.memory.IMemoryRendering; +import org.eclipse.debug.ui.memory.IMemoryRenderingTypeDelegate; + +public class HexIntegerRenderingDelegate implements IMemoryRenderingTypeDelegate { + + public HexIntegerRenderingDelegate() { + } + + public IMemoryRendering createRendering(String id) throws CoreException { + return new HexIntegerRendering(id); + } + +} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexRendering.java index e23db098a..23d0fd727 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexRendering.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/HexRendering.java @@ -41,7 +41,7 @@ public class HexRendering extends AbstractAsyncTableRendering { { if (data[i].isReadable()) { - strBuffer.append(new String(convertByteToCharArray(data[i].getValue()))); + strBuffer.append(new String(RenderingsUtil.convertByteToCharArray(data[i].getValue()))); } else { @@ -58,7 +58,7 @@ public class HexRendering extends AbstractAsyncTableRendering { */ public byte[] getBytes(String dataType, BigInteger address, MemoryByte[] currentValues, String data) { - byte[] bytes = convertHexStringToByteArray(data, currentValues.length); + byte[] bytes = RenderingsUtil.convertHexStringToByteArray(data, currentValues.length, getNumCharsPerByte()); return bytes; } @@ -67,86 +67,5 @@ public class HexRendering extends AbstractAsyncTableRendering { { return 2; } - - /** - * byte array to Hex string helper - * replaces the Integer.toHexString() which can't convert byte values properly - * (always pads with FFFFFF) - */ - static public String convertByteArrayToHexString(byte[] byteArray) - { - StringBuffer strBuffer = new StringBuffer(); - char charArray[]; - - for (int i=0; i<byteArray.length;i ++) - { - charArray = convertByteToCharArray(byteArray[i]); - strBuffer.append(charArray); - } - - return strBuffer.toString(); - } - - static private char[] convertByteToCharArray(byte aByte) - { - char charArray[] = new char[2]; - int val = aByte; - if (val<0) val += 256; - charArray[0] = Character.forDigit(val/16, 16); - charArray[1] = Character.forDigit(val%16, 16); - - return charArray; - } - - /** - * Convert raw memory data to byte array - * @param str - * @param numBytes - * @return an array of byte, converted from a hex string - * @throws NumberFormatException - */ - public byte[] convertHexStringToByteArray(String str, int numBytes) throws NumberFormatException - { - if (str.length() == 0) - return null; - - StringBuffer buf = new StringBuffer(str); - - // pad string with zeros - int requiredPadding = numBytes * getNumCharsPerByte() - str.length(); - while (requiredPadding > 0) { - buf.insert(0, "0"); //$NON-NLS-1$ - requiredPadding--; - } - - byte[] bytes = new byte[numBytes]; - str = buf.toString(); - - // set data in memory - for (int i=0; i<bytes.length; i++) - { - // convert string to byte - String oneByte = str.substring(i*2, i*2+2); - - Integer number = Integer.valueOf(oneByte, 16); - if (number.compareTo(Integer.valueOf(Byte.toString(Byte.MAX_VALUE))) > 0) - { - int temp = number.intValue(); - temp = temp - 256; - - String tempStr = Integer.toString(temp); - - Byte myByte = Byte.valueOf(tempStr); - bytes[i] = myByte.byteValue(); - } - else - { - Byte myByte = Byte.valueOf(oneByte, 16); - bytes[i] = myByte.byteValue(); - } - } - - return bytes; - } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/RenderingsUtil.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/RenderingsUtil.java index 2b806c3f8..686902c59 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/RenderingsUtil.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/RenderingsUtil.java @@ -494,5 +494,87 @@ public class RenderingsUtil { buf[j] = new Integer(i>>(1-j)*8).byteValue(); } return buf; + } + + /** + * byte array to Hex string helper + * replaces the Integer.toHexString() which can't convert byte values properly + * (always pads with FFFFFF) + */ + static public String convertByteArrayToHexString(byte[] byteArray) + { + StringBuffer strBuffer = new StringBuffer(); + char charArray[]; + + for (int i=0; i<byteArray.length;i ++) + { + charArray = RenderingsUtil.convertByteToCharArray(byteArray[i]); + strBuffer.append(charArray); + } + + return strBuffer.toString(); + } + + static public char[] convertByteToCharArray(byte aByte) + { + char charArray[] = new char[2]; + int val = aByte; + if (val<0) val += 256; + charArray[0] = Character.forDigit(val/16, 16); + charArray[1] = Character.forDigit(val%16, 16); + + return charArray; + } + + /** + * Convert raw memory data to byte array + * @param str + * @param numBytes + * @param numCharsPerByte - number of characters per byte of data + * @return an array of byte, converted from a hex string + * @throws NumberFormatException + */ + public static byte[] convertHexStringToByteArray(String str, int numBytes, int numCharsPerByte) throws NumberFormatException + { + if (str.length() == 0) + return null; + + StringBuffer buf = new StringBuffer(str); + + // pad string with zeros + int requiredPadding = numBytes * numCharsPerByte - str.length(); + while (requiredPadding > 0) { + buf.insert(0, "0"); //$NON-NLS-1$ + requiredPadding--; + } + + byte[] bytes = new byte[numBytes]; + str = buf.toString(); + + // set data in memory + for (int i=0; i<bytes.length; i++) + { + // convert string to byte + String oneByte = str.substring(i*2, i*2+2); + + Integer number = Integer.valueOf(oneByte, 16); + if (number.compareTo(Integer.valueOf(Byte.toString(Byte.MAX_VALUE))) > 0) + { + int temp = number.intValue(); + temp = temp - 256; + + String tempStr = Integer.toString(temp); + + Byte myByte = Byte.valueOf(tempStr); + bytes[i] = myByte.byteValue(); + } + else + { + Byte myByte = Byte.valueOf(oneByte, 16); + bytes[i] = myByte.byteValue(); + } + } + + return bytes; } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingLine.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingLine.java index 4ab7cbba5..2c7e30ecd 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingLine.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/TableRenderingLine.java @@ -81,7 +81,7 @@ public class TableRenderingLine extends PlatformObject { if (fStrRep == null) { StringBuffer buffer = new StringBuffer(); - fStrRep = HexRendering.convertByteArrayToHexString(getByteArray()); + fStrRep = RenderingsUtil.convertByteArrayToHexString(getByteArray()); fStrRep = fStrRep.toUpperCase(); buffer = buffer.append(fStrRep); |