Added valueOf(...) method to AsmNumberUtil to parse the number formats
authorFabian Stemmler <stemmler@in.tum.de>
Sat, 24 Aug 2019 16:15:48 +0000 (18:15 +0200)
committerFabian Stemmler <stemmler@in.tum.de>
Sat, 24 Aug 2019 16:15:48 +0000 (18:15 +0200)
net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmNumberUtil.java

index 5637dc7..264d447 100644 (file)
@@ -2,6 +2,7 @@ package net.mograsim.plugin.asm;
 \r
 import static java.lang.String.format;\r
 \r
+import java.math.BigInteger;\r
 import java.util.regex.Pattern;\r
 \r
 public final class AsmNumberUtil\r
@@ -12,11 +13,11 @@ public final class AsmNumberUtil
 \r
        }\r
 \r
-       private static final String sgnPat = "[-+]?";\r
-       private static final String binPat = "(?:[01]+_)*[01]+";\r
-       private static final String octPat = "(?:[0-7]+_)*[0-7]+";\r
-       private static final String decPat = "(?:[0-9]+_)*[0-9]+";\r
-       private static final String hexPat = "(?:[0-9a-f]+_)*[0-9a-f]+";\r
+       private static final String sgnPat = "([-+]?)";\r
+       private static final String binPat = "((?:[01]+_)*[01]+)";\r
+       private static final String octPat = "((?:[0-7]+_)*[0-7]+)";\r
+       private static final String decPat = "((?:[0-9]+_)*[0-9]+)";\r
+       private static final String hexPat = "((?:[0-9a-f]+_)*[0-9a-f]+)";\r
        static final Pattern numberBin = Pattern.compile(format("%1$s0b%2$s|%1$s%2$sb", sgnPat, binPat), Pattern.CASE_INSENSITIVE);\r
        static final Pattern numberOct = Pattern.compile(format("%s%sq", sgnPat, octPat), Pattern.CASE_INSENSITIVE);\r
        static final Pattern numberDec = Pattern.compile(format("%s%s", sgnPat, decPat));\r
@@ -112,8 +113,31 @@ public final class AsmNumberUtil
                return NumberType.NONE;\r
        }\r
 \r
+       private static CharSequence extractSignAndDigits(NumberType type, CharSequence cs)\r
+       {\r
+               return type.numberPattern.matcher(cs).replaceAll("$1$2").replaceAll("_", "");\r
+       }\r
+\r
+       public static BigInteger valueOf(CharSequence cs)\r
+       {\r
+               NumberType type = getType(cs);\r
+               if (NumberType.NONE.equals(type))\r
+                       throw new NumberFormatException();\r
+               return new BigInteger(extractSignAndDigits(type, cs).toString(), type.radix);\r
+       }\r
+\r
        public enum NumberType\r
        {\r
-               NONE, BINARY, OCTAL, DECIMAL, HEXADECIMAL, FLOATINGPOINT\r
+               NONE(-1, null), BINARY(2, AsmNumberUtil.numberBin), OCTAL(8, AsmNumberUtil.numberOct), DECIMAL(10, AsmNumberUtil.numberDec),\r
+               HEXADECIMAL(16, AsmNumberUtil.numberHex), FLOATINGPOINT(10, AsmNumberUtil.numberFloat);\r
+\r
+               public final int radix;\r
+               private final Pattern numberPattern;\r
+\r
+               NumberType(int radix, Pattern numberPattern)\r
+               {\r
+                       this.radix = radix;\r
+                       this.numberPattern = numberPattern;\r
+               }\r
        }\r
 }\r