Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-debug-dev] PATCH: View variables in binary format

This patch implements support for viewing variables (or registers) in
binary format.  CVariableFormat already had a BINARY tag, but it was
unused.  I tested this patch by using the Cygwin debugger from Eclipse.

There are three patch files attached: for cdt.core, cdt.debug.core, and
cdt.debug.ui.

-- 
Mark Mitchell
CodeSourcery
mark@xxxxxxxxxxxxxxxx
(650) 331-3385 x713
Index: src/org/eclipse/cdt/core/IAddress.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/IAddress.java,v
retrieving revision 1.4
diff -u -r1.4 IAddress.java
--- src/org/eclipse/cdt/core/IAddress.java	27 Jun 2005 03:46:47 -0000	1.4
+++ src/org/eclipse/cdt/core/IAddress.java	14 Apr 2006 23:59:01 -0000
@@ -103,6 +103,16 @@
 	 */
 	String toHexAddressString();
 
+
+	/**
+	 * Converts address to the hex 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.
Index: utils/org/eclipse/cdt/utils/Addr32.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Addr32.java,v
retrieving revision 1.4
diff -u -r1.4 Addr32.java
--- utils/org/eclipse/cdt/utils/Addr32.java	27 Jun 2005 03:46:47 -0000	1.4
+++ utils/org/eclipse/cdt/utils/Addr32.java	14 Apr 2006 23:59:01 -0000
@@ -26,6 +26,8 @@
 	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 +133,18 @@
 		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;
 	}
Index: utils/org/eclipse/cdt/utils/Addr64.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Addr64.java,v
retrieving revision 1.4
diff -u -r1.4 Addr64.java
--- utils/org/eclipse/cdt/utils/Addr64.java	27 Jun 2005 03:46:47 -0000	1.4
+++ utils/org/eclipse/cdt/utils/Addr64.java	14 Apr 2006 23:59:01 -0000
@@ -24,6 +24,8 @@
 	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 +128,18 @@
 		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;
 	}
Index: src/org/eclipse/cdt/debug/internal/core/model/CValue.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CValue.java,v
retrieving revision 1.60
diff -u -r1.60 CValue.java
--- src/org/eclipse/cdt/debug/internal/core/model/CValue.java	29 Jul 2005 02:12:02 -0000	1.60
+++ src/org/eclipse/cdt/debug/internal/core/model/CValue.java	14 Apr 2006 23:59:55 -0000
@@ -239,6 +239,12 @@
 			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;
 	}
 
@@ -253,6 +259,12 @@
 			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;
 	}
 
@@ -267,6 +279,12 @@
 			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;
 	}
 
@@ -290,6 +308,16 @@
 					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 ) {
 		}
@@ -316,6 +344,16 @@
 					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 ) {
 		}
@@ -341,6 +379,12 @@
 			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;
 	}
 
@@ -363,6 +407,12 @@
 			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;
 	}
 
@@ -380,6 +430,8 @@
 			return address.toHexAddressString();
 		if ( CVariableFormat.DECIMAL.equals( format ) )
 			return address.toString();
+		if ( CVariableFormat.BINARY.equals( format ) )
+			return address.toBinaryAddressString();
 		return null;
 	}
 
@@ -397,6 +449,12 @@
 					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(); 
@@ -409,6 +467,12 @@
 					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();
Index: plugin.properties
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-debug/org.eclipse.cdt.debug.ui/plugin.properties,v
retrieving revision 1.86
diff -u -r1.86 plugin.properties
--- plugin.properties	23 Jun 2005 16:00:55 -0000	1.86
+++ plugin.properties	15 Apr 2006 00:00:07 -0000
@@ -59,6 +59,7 @@
 HexVariableFormatAction.label=Hexadecimal
 DecVariableFormatAction.label=Decimal
 NaturalVariableFormatAction.label=Natural
+BinaryVariableFormatAction.label=Binary
 
 CDebugActionGroup.name=C/C++ Debug
 
Index: plugin.xml
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-debug/org.eclipse.cdt.debug.ui/plugin.xml,v
retrieving revision 1.158.2.3
diff -u -r1.158.2.3 plugin.xml
--- plugin.xml	30 Jan 2006 15:06:14 -0000	1.158.2.3
+++ plugin.xml	15 Apr 2006 00:00:08 -0000
@@ -411,6 +411,13 @@
                enablesFor="1"
                id="org.eclipse.cdt.debug.internal.ui.actions.NaturalVariableFormatActionDelegate">
          </action>
+         <action
+               class="org.eclipse.cdt.debug.internal.ui.actions.BinaryVariableFormatActionDelegate"
+               enablesFor="1"
+               helpContextId="binary_variable_format_action_context"
+               id="org.eclipse.cdt.debug.internal.ui.actions.BinaryVariableFormatActionDelegate"
+               label="%BinaryVariableFormatAction.label"
+               menubarPath="org.eclipse.cdt.debug.ui.CVariableFormatMenu/formatGroup"/>
       </objectContribution>
       <objectContribution
             objectClass="org.eclipse.cdt.debug.core.model.ICSignal"
Index: src/org/eclipse/cdt/debug/internal/ui/actions/BinaryVariableFormatActionDelegate.java
===================================================================
RCS file: src/org/eclipse/cdt/debug/internal/ui/actions/BinaryVariableFormatActionDelegate.java
diff -N src/org/eclipse/cdt/debug/internal/ui/actions/BinaryVariableFormatActionDelegate.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/debug/internal/ui/actions/BinaryVariableFormatActionDelegate.java	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 QNX Software Systems 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:
+ *     QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.actions;
+
+import org.eclipse.cdt.debug.core.model.CVariableFormat;
+
+/**
+ * The delegate of the "Binary Format" action.
+ */
+public class BinaryVariableFormatActionDelegate extends VariableFormatActionDelegate {
+
+	/**
+	 * Constructor for BinaryVariableFormatActionDelegate.
+	 */
+	public BinaryVariableFormatActionDelegate() {
+		super( CVariableFormat.BINARY );
+	}
+}

Back to the top