diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/IAddress.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/IAddress.java index 3312d7196f6..cc74b907255 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/IAddress.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/IAddress.java @@ -7,6 +7,7 @@ * * Contributors: * Intel Corporation - Initial API and implementation + * Mark Mitchell, CodeSourcery - Bug 136896: View variables in binary format *******************************************************************************/ package org.eclipse.cdt.core; @@ -20,8 +21,7 @@ import java.math.BigInteger; * Please see Addr32 and Addr64 classes to see how this interface should * be extended */ -public interface IAddress extends Comparable -{ +public interface IAddress extends Comparable { /** * Adds offset to address and returns new address object * which is the result @@ -103,6 +103,16 @@ public interface IAddress extends Comparable */ String toHexAddressString(); + + /** + * Converts address to the binary representation with '0b' prefix and + * with all leading zeros. The length of returned string should be + * the same for all addresses of given class. I.e. 34 for 32-bit + * addresses and 66 for 64-bit addresses + * @return + */ + String toBinaryAddressString(); + /** * Returns amount of symbols in hex representation. Is identical to * toHexAddressString().length(). It is present for perfomance purpose. diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Addr32.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Addr32.java index 701b6e895b5..9a96ed920db 100644 --- a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Addr32.java +++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Addr32.java @@ -7,7 +7,8 @@ * * Contributors: * Intel Corporation - Initial API and implementation - ******************************************************************************/ + * Mark Mitchell, CodeSourcery - Bug 136896: View variables in binary format +******************************************************************************/ package org.eclipse.cdt.utils; import java.math.BigInteger; @@ -26,6 +27,8 @@ public class Addr32 implements IAddress { private static final int BYTES_NUM = 4; private static final int DIGITS_NUM = BYTES_NUM * 2; private static final int CHARS_NUM = DIGITS_NUM + 2; + private static final int BINARY_DIGITS_NUM = BYTES_NUM * 8; + private static final int BINARY_CHARS_NUM = BINARY_DIGITS_NUM + 2; private final long address; @@ -131,6 +134,18 @@ public class Addr32 implements IAddress { return sb.toString(); } + public String toBinaryAddressString() { + String addressString = Long.toString(address, 2); + StringBuffer sb = new StringBuffer(BINARY_CHARS_NUM); + int count = BINARY_DIGITS_NUM - addressString.length(); + sb.append("0b"); //$NON-NLS-1$ + for (int i = 0; i < count; ++i) { + sb.append('0'); + } + sb.append(addressString); + return sb.toString(); + } + public int getCharsNum() { return CHARS_NUM; } diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Addr64.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Addr64.java index ade86440d58..47b20ca9b61 100644 --- a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Addr64.java +++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Addr64.java @@ -7,6 +7,7 @@ * * Contributors: * Intel Corporation - Initial API and implementation + * Mark Mitchell, CodeSourcery - Bug 136896: View variables in binary format ******************************************************************************/ package org.eclipse.cdt.utils; @@ -24,6 +25,8 @@ public class Addr64 implements IAddress { private static final int BYTES_NUM = 8; private static final int DIGITS_NUM = BYTES_NUM * 2; private static final int CHARS_NUM = DIGITS_NUM + 2; + private static final int BINARY_DIGITS_NUM = BYTES_NUM * 8; + private static final int BINARY_CHARS_NUM = BINARY_DIGITS_NUM + 2; private final BigInteger address; @@ -126,6 +129,18 @@ public class Addr64 implements IAddress { return sb.toString(); } + public String toBinaryAddressString() { + String addressString = address.toString(2); + StringBuffer sb = new StringBuffer(BINARY_CHARS_NUM); + int count = BINARY_DIGITS_NUM - addressString.length(); + sb.append("0b"); //$NON-NLS-1$ + for (int i = 0; i < count; ++i) { + sb.append('0'); + } + sb.append(addressString); + return sb.toString(); + } + public int getCharsNum() { return CHARS_NUM; } diff --git a/debug/org.eclipse.cdt.debug.core/ChangeLog b/debug/org.eclipse.cdt.debug.core/ChangeLog index 2fc6ffe42b6..71b112460a8 100644 --- a/debug/org.eclipse.cdt.debug.core/ChangeLog +++ b/debug/org.eclipse.cdt.debug.core/ChangeLog @@ -1,3 +1,8 @@ +2006-08-14 Mikhail Khodjaiants + Bug 136896: View variables in binary format. + Applied modified patch from Mark Mitchell (CodeSourcery). + * CValue.java + 2006-05-31 Mikhail Khodjaiants Bug 144719: [Modules view] Modules from from different sessions are mixed up. * CDebugElement.java diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CValue.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CValue.java index 204c7a730f5..a7b6495c5f0 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CValue.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CValue.java @@ -7,6 +7,7 @@ * * Contributors: * QNX Software Systems - Initial API and implementation + * Mark Mitchell, CodeSourcery - Bug 136896: View variables in binary format *******************************************************************************/ package org.eclipse.cdt.debug.internal.core.model; @@ -246,6 +247,12 @@ public class CValue extends AbstractCValue { sb.append( (stringValue.length() > 2) ? stringValue.substring( stringValue.length() - 2 ) : stringValue ); return sb.toString(); } + else if ( CVariableFormat.BINARY.equals( format ) ) { + StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$ + String stringValue = (isUnsigned()) ? Integer.toBinaryString( value.shortValue() ) : Integer.toBinaryString( (byte)value.byteValue() ); + sb.append( (stringValue.length() > 8) ? stringValue.substring( stringValue.length() - 8 ) : stringValue ); + return sb.toString(); + } return null; } @@ -260,6 +267,12 @@ public class CValue extends AbstractCValue { sb.append( (stringValue.length() > 4) ? stringValue.substring( stringValue.length() - 4 ) : stringValue ); return sb.toString(); } + else if ( CVariableFormat.BINARY.equals( format ) ) { + StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$ + String stringValue = Integer.toBinaryString( (isUnsigned()) ? value.intValue() : value.shortValue() ); + sb.append( (stringValue.length() > 16) ? stringValue.substring( stringValue.length() - 16 ) : stringValue ); + return sb.toString(); + } return null; } @@ -274,6 +287,12 @@ public class CValue extends AbstractCValue { sb.append( (stringValue.length() > 8) ? stringValue.substring( stringValue.length() - 8 ) : stringValue ); return sb.toString(); } + else if ( CVariableFormat.BINARY.equals( format ) ) { + StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$ + String stringValue = (isUnsigned()) ? Long.toBinaryString( value.longValue() ) : Integer.toBinaryString( value.intValue() ); + sb.append( (stringValue.length() > 32) ? stringValue.substring( stringValue.length() - 32 ) : stringValue ); + return sb.toString(); + } return null; } @@ -297,6 +316,16 @@ public class CValue extends AbstractCValue { sb.append( Long.toHexString( value.longValue() ) ); return sb.toString(); } + else if ( CVariableFormat.BINARY.equals( format ) ) { + StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$ + if ( isUnsigned() ) { + BigInteger bigValue = new BigInteger( value.getValueString() ); + sb.append( bigValue.toString( 2 ) ); + } + else + sb.append( Long.toBinaryString( value.longValue() ) ); + return sb.toString(); + } } catch( NumberFormatException e ) { } @@ -323,6 +352,16 @@ public class CValue extends AbstractCValue { sb.append( Long.toHexString( value.longValue() ) ); return sb.toString(); } + else if ( CVariableFormat.BINARY.equals( format ) ) { + StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$ + if ( isUnsigned() ) { + BigInteger bigValue = new BigInteger( value.getValueString() ); + sb.append( bigValue.toString( 2 ) ); + } + else + sb.append( Long.toBinaryString( value.longValue() ) ); + return sb.toString(); + } } catch( NumberFormatException e ) { } @@ -348,6 +387,12 @@ public class CValue extends AbstractCValue { sb.append( (stringValue.length() > 8) ? stringValue.substring( stringValue.length() - 8 ) : stringValue ); return sb.toString(); } + else if ( CVariableFormat.BINARY.equals( format ) ) { + StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$ + String stringValue = Long.toBinaryString( longValue ); + sb.append( (stringValue.length() > 32) ? stringValue.substring( stringValue.length() - 32 ) : stringValue ); + return sb.toString(); + } return null; } @@ -370,6 +415,12 @@ public class CValue extends AbstractCValue { sb.append( (stringValue.length() > 16) ? stringValue.substring( stringValue.length() - 16 ) : stringValue ); return sb.toString(); } + else if ( CVariableFormat.BINARY.equals( format ) ) { + StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$ + String stringValue = Long.toHexString( longValue ); + sb.append( (stringValue.length() > 64) ? stringValue.substring( stringValue.length() - 64 ) : stringValue ); + return sb.toString(); + } return null; } @@ -387,6 +438,8 @@ public class CValue extends AbstractCValue { return address.toHexAddressString(); if ( CVariableFormat.DECIMAL.equals( format ) ) return address.toString(); + if ( CVariableFormat.BINARY.equals( format ) ) + return address.toBinaryAddressString(); return null; } @@ -404,6 +457,12 @@ public class CValue extends AbstractCValue { sb.append( (stringValue.length() > 4) ? stringValue.substring( stringValue.length() - 4 ) : stringValue ); return sb.toString(); } + else if ( CVariableFormat.BINARY.equals( format ) ) { + StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$ + String stringValue = Integer.toBinaryString( (isUnsigned()) ? value.intValue() : value.shortValue() ); + sb.append( (stringValue.length() > 16) ? stringValue.substring( stringValue.length() - 16 ) : stringValue ); + return sb.toString(); + } } if ( size == 4 ) { CVariableFormat format = getParentVariable().getFormat(); @@ -416,6 +475,12 @@ public class CValue extends AbstractCValue { sb.append( (stringValue.length() > 8) ? stringValue.substring( stringValue.length() - 8 ) : stringValue ); return sb.toString(); } + else if ( CVariableFormat.BINARY.equals( format ) ) { + StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$ + String stringValue = (isUnsigned()) ? Long.toBinaryString( value.longValue() ) : Integer.toHexString( value.intValue() ); + sb.append( (stringValue.length() > 32) ? stringValue.substring( stringValue.length() - 32 ) : stringValue ); + return sb.toString(); + } } } return value.getValueString(); diff --git a/debug/org.eclipse.cdt.debug.ui/ChangeLog b/debug/org.eclipse.cdt.debug.ui/ChangeLog index 4918ec67f80..24a6f2884a9 100644 --- a/debug/org.eclipse.cdt.debug.ui/ChangeLog +++ b/debug/org.eclipse.cdt.debug.ui/ChangeLog @@ -1,3 +1,12 @@ +2006-08-14 Mikhail Khodjaiants + Bug 136896: View variables in binary format. + Applied modified patch from Mark Mitchell (CodeSourcery). + * plugin.properties + * plugin.xml + * PreferenceMessages.properties + * CDebugPreferencePage.java + * BinaryVariableFormatActionDelegate.java + 2006-05-31 Mikhail Khodjaiants Bug 144719: [Modules view] Modules from from different sessions are mixed up. * ModulesViewEventHandler.java diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.properties b/debug/org.eclipse.cdt.debug.ui/plugin.properties index 6cdd042abee..50cef95140e 100644 --- a/debug/org.eclipse.cdt.debug.ui/plugin.properties +++ b/debug/org.eclipse.cdt.debug.ui/plugin.properties @@ -62,6 +62,7 @@ CVariableFormatMenu.label=Format HexVariableFormatAction.label=Hexadecimal DecVariableFormatAction.label=Decimal NaturalVariableFormatAction.label=Natural +BinaryVariableFormatAction.label=Binary CDebugActionGroup.name=C/C++ Debug diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.xml b/debug/org.eclipse.cdt.debug.ui/plugin.xml index e354d321cd9..8cf97350a4c 100644 --- a/debug/org.eclipse.cdt.debug.ui/plugin.xml +++ b/debug/org.eclipse.cdt.debug.ui/plugin.xml @@ -397,6 +397,13 @@ enablesFor="1" id="org.eclipse.cdt.debug.internal.ui.actions.NaturalVariableFormatActionDelegate"> +