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">
+