Merge branch 'master' into lttng-luna
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.core / src / org / eclipse / linuxtools / tmf / core / ctfadaptor / CtfTmfEventField.java
index 6ac34e30d886b2362ab809d96a62e16eccb48e1d..4b82324fd3fa0168c6e5b0ab57103df029810a23 100644 (file)
@@ -11,6 +11,7 @@
  *  Alexandre Montplaisir - Initial API and implementation, extend TmfEventField
  *  Bernd Hufmann - Add Enum field handling
  *  Geneviève Bastien - Add Struct and Variant field handling
+ *  Jean-Christian Kouame - Correct handling of unsigned integer fields
  *******************************************************************************/
 
 package org.eclipse.linuxtools.tmf.core.ctfadaptor;
@@ -89,7 +90,7 @@ public abstract class CtfTmfEventField extends TmfEventField {
         if (fieldDef instanceof IntegerDefinition) {
             IntegerDefinition intDef = (IntegerDefinition) fieldDef;
             int base = intDef.getDeclaration().getBase();
-            field = new CTFIntegerField(fieldName, intDef.getValue(), base);
+            field = new CTFIntegerField(fieldName, intDef.getValue(), base, intDef.getDeclaration().isSigned());
 
         } else if (fieldDef instanceof EnumDefinition) {
             EnumDefinition enumDef = (EnumDefinition) fieldDef;
@@ -116,7 +117,8 @@ public abstract class CtfTmfEventField extends TmfEventField {
                 for (int i = 0; i < arrayDecl.getLength(); i++) {
                     values.add(((IntegerDefinition) arrayDef.getElem(i)).getValue());
                 }
-                field = new CTFIntegerArrayField(fieldName, values, ((IntegerDeclaration) arrayDecl.getElementType()).getBase());
+                field = new CTFIntegerArrayField(fieldName, values, ((IntegerDeclaration) arrayDecl.getElementType()).getBase(),
+                        ((IntegerDeclaration) arrayDecl.getElementType()).isSigned());
             }
             /* Add other types of arrays here */
 
@@ -136,7 +138,8 @@ public abstract class CtfTmfEventField extends TmfEventField {
                 for (int i = 0; i < seqDef.getLength(); i++) {
                     values.add(((IntegerDefinition) seqDef.getElem(i)).getValue());
                 }
-                field = new CTFIntegerArrayField(fieldName, values, ((IntegerDeclaration) seqDecl.getElementType()).getBase());
+                field = new CTFIntegerArrayField(fieldName, values, ((IntegerDeclaration) seqDecl.getElementType()).getBase(),
+                        ((IntegerDeclaration) seqDecl.getElementType()).isSigned());
             }
             /* Add other Sequence types here */
 
@@ -170,7 +173,10 @@ public abstract class CtfTmfEventField extends TmfEventField {
             }
 
         } else {
-            /* Safe-guard, to avoid null exceptions later, field is expected not to be null */
+            /*
+             * Safe-guard, to avoid null exceptions later, field is expected not
+             * to be null
+             */
             field = new CTFStringField(fieldName, Messages.TmfEventField_UnsupportedType + fieldDef.getClass().toString());
         }
         return field;
@@ -180,41 +186,6 @@ public abstract class CtfTmfEventField extends TmfEventField {
     public String toString() {
         return getName() + '=' + getFormattedValue();
     }
-
-    /**
-     * Print a numeric value as a string in a given base
-     *
-     * @param value
-     *            The value to print as string
-     * @param base
-     *            The base for this value
-     * @return formatted number string
-     * @since 2.0
-     */
-    protected final static String formatNumber(long value, int base) {
-        String s;
-        /* Format the number correctly according to the integer's base */
-        switch (base) {
-        case 2:
-            s = "0b" + Long.toBinaryString(value); //$NON-NLS-1$
-            break;
-        case 8:
-            s = "0" + Long.toOctalString(value); //$NON-NLS-1$
-            break;
-        case 10:
-            s = Long.toString(value);
-            break;
-        case 16:
-            s = "0x" + Long.toHexString(value); //$NON-NLS-1$
-            break;
-        default:
-            /* Non-standard base, we'll just print it as a decimal number */
-            s = Long.toString(value);
-            break;
-        }
-        return s;
-    }
-
 }
 
 /**
@@ -225,18 +196,22 @@ public abstract class CtfTmfEventField extends TmfEventField {
 final class CTFIntegerField extends CtfTmfEventField {
 
     private final int base;
+    private final boolean signed;
 
     /**
      * A CTF "IntegerDefinition" can be an integer of any byte size, so in the
      * Java parser this is interpreted as a long.
      *
-     * @param longValue
-     *            The integer value of this field
      * @param name
      *            The name of this field
+     * @param longValue
+     *            The integer value of this field
+     * @param signed
+     *            Is the value signed or not
      */
-    CTFIntegerField(String name, long longValue, int base) {
+    CTFIntegerField(String name, long longValue, int base, boolean signed) {
         super(name, longValue, null);
+        this.signed = signed;
         this.base = base;
     }
 
@@ -247,7 +222,7 @@ final class CTFIntegerField extends CtfTmfEventField {
 
     @Override
     public String getFormattedValue() {
-        return formatNumber(getValue(), base);
+        return IntegerDefinition.formatNumber(getValue(), base, signed);
     }
 
 }
@@ -285,20 +260,24 @@ final class CTFStringField extends CtfTmfEventField {
 final class CTFIntegerArrayField extends CtfTmfEventField {
 
     private final int base;
+    private final boolean signed;
     private String formattedValue = null;
 
     /**
      * Constructor for CTFIntegerArrayField.
      *
+     * @param name
+     *            The name of this field
      * @param longValues
      *            The array of integers (as longs) that compose this field's
      *            value
-     * @param name
-     *            The name of this field
+     * @param signed
+     *            Are the values in the array signed or not
      */
-    CTFIntegerArrayField(String name, List<Long> longValues, int base) {
+    CTFIntegerArrayField(String name, List<Long> longValues, int base, boolean signed) {
         super(name, longValues, null);
         this.base = base;
+        this.signed = signed;
     }
 
     @Override
@@ -311,7 +290,7 @@ final class CTFIntegerArrayField extends CtfTmfEventField {
         if (formattedValue == null) {
             List<String> strings = new ArrayList<String>();
             for (Long value : getValue()) {
-                strings.add(formatNumber(value, base));
+                strings.add(IntegerDefinition.formatNumber(value, base, signed));
             }
             formattedValue = strings.toString();
         }
@@ -356,13 +335,14 @@ final class CTFEnumField extends CtfTmfEventField {
      * Constructor for CTFEnumField.
      *
      * @param enumValue
-     *            The Enum value consisting of a pair of Enum value name and its long value
+     *            The Enum value consisting of a pair of Enum value name and its
+     *            long value
      * @param name
      *            The name of this field
      */
     CTFEnumField(String name, CtfEnumPair enumValue) {
         super(name, new CtfEnumPair(enumValue.getFirst(),
-                                    enumValue.getSecond().longValue()), null);
+                enumValue.getSecond().longValue()), null);
     }
 
     @Override
@@ -418,7 +398,7 @@ final class CTFVariantField extends CtfTmfEventField {
      *            The name of this field
      */
     CTFVariantField(String name, CtfTmfEventField field) {
-        super(name, field, new CtfTmfEventField[]{ field });
+        super(name, field, new CtfTmfEventField[] { field });
     }
 
     @Override
This page took 0.026447 seconds and 5 git commands to generate.