altosui: Move number parsing code to Altos general class
authorKeith Packard <keithp@keithp.com>
Fri, 27 Aug 2010 06:41:26 +0000 (23:41 -0700)
committerKeith Packard <keithp@keithp.com>
Fri, 27 Aug 2010 06:41:26 +0000 (23:41 -0700)
This moves these shared functions to the global shared class.

Signed-off-by: Keith Packard <keithp@keithp.com>
ao-tools/altosui/Altos.java
ao-tools/altosui/AltosDebug.java
ao-tools/altosui/AltosParse.java

index 53359e2..07bd01a 100644 (file)
@@ -114,4 +114,90 @@ public class Altos {
        static final int AO_GPS_DATE_VALID = (1 << 6);
        static final int AO_GPS_NUM_SAT_SHIFT = 0;
        static final int AO_GPS_NUM_SAT_MASK = 0xf;
+
+       static boolean isspace(int c) {
+               switch (c) {
+               case ' ':
+               case '\t':
+                       return true;
+               }
+               return false;
+       }
+
+       static boolean ishex(int c) {
+               if ('0' <= c && c <= '9')
+                       return true;
+               if ('a' <= c && c <= 'f')
+                       return true;
+               if ('A' <= c && c <= 'F')
+                       return true;
+               return false;
+       }
+
+       static boolean ishex(String s) {
+               for (int i = 0; i < s.length(); i++)
+                       if (!ishex(s.charAt(i)))
+                               return false;
+               return true;
+       }
+
+       static int fromhex(int c) {
+               if ('0' <= c && c <= '9')
+                       return c - '0';
+               if ('a' <= c && c <= 'f')
+                       return c - 'a' + 10;
+               if ('A' <= c && c <= 'F')
+                       return c - 'A' + 10;
+               return -1;
+       }
+
+       static int fromhex(String s) throws NumberFormatException {
+               int c, v = 0;
+               for (int i = 0; i < s.length(); i++) {
+                       c = s.charAt(i);
+                       if (!ishex(c)) {
+                               if (i == 0)
+                                       throw new NumberFormatException(String.format("invalid hex \"%s\"", s));
+                               return v;
+                       }
+                       v = v * 16 + fromhex(c);
+               }
+               return v;
+       }
+
+       static boolean isdec(int c) {
+               if ('0' <= c && c <= '9')
+                       return true;
+               return false;
+       }
+
+       static boolean isdec(String s) {
+               for (int i = 0; i < s.length(); i++)
+                       if (!isdec(s.charAt(i)))
+                               return false;
+               return true;
+       }
+
+       static int fromdec(int c) {
+               if ('0' <= c && c <= '9')
+                       return c - '0';
+               return -1;
+       }
+
+       static int fromdec(String s) throws NumberFormatException {
+               int c, v = 0;
+               int sign = 1;
+               for (int i = 0; i < s.length(); i++) {
+                       c = s.charAt(i);
+                       if (i == 0 && c == '-') {
+                               sign = -1;
+                       } else if (!isdec(c)) {
+                               if (i == 0)
+                                       throw new NumberFormatException(String.format("invalid number \"%s\"", s));
+                               return v;
+                       } else
+                               v = v * 10 + fromdec(c);
+               }
+               return v * sign;
+       }
 }
index 06c9a0b..ca2e5a9 100644 (file)
@@ -58,41 +58,6 @@ public class AltosDebug extends AltosSerial {
        public static final byte GET_CHIP_ID =          0x68;
 
 
-       static boolean ishex(int c) {
-               if ('0' <= c && c <= '9')
-                       return true;
-               if ('a' <= c && c <= 'f')
-                       return true;
-               if ('A' <= c && c <= 'F')
-                       return true;
-               return false;
-       }
-
-       static boolean ishex(String s) {
-               for (int i = 0; i < s.length(); i++)
-                       if (!ishex(s.charAt(i)))
-                               return false;
-               return true;
-       }
-       static boolean isspace(int c) {
-               switch (c) {
-               case ' ':
-               case '\t':
-                       return true;
-               }
-               return false;
-       }
-
-       static int fromhex(int c) {
-               if ('0' <= c && c <= '9')
-                       return c - '0';
-               if ('a' <= c && c <= 'f')
-                       return c - 'a' + 10;
-               if ('A' <= c && c <= 'F')
-                       return c - 'A' + 10;
-               return -1;
-       }
-
        boolean debug_mode;
 
        void ensure_debug_mode() {
@@ -145,14 +110,14 @@ public class AltosDebug extends AltosSerial {
                int start = 0;
                while (i < length) {
                        String  line = get_reply().trim();
-                       if (!ishex(line) || line.length() % 2 != 0)
+                       if (!Altos.ishex(line) || line.length() % 2 != 0)
                                throw new IOException(
                                        String.format
                                        ("Invalid reply \"%s\"", line));
                        int this_time = line.length() / 2;
                        for (int j = 0; j < this_time; j++)
-                               data[start + j] = (byte) ((fromhex(line.charAt(j*2)) << 4) +
-                                                 fromhex(line.charAt(j*2+1)));
+                               data[start + j] = (byte) ((Altos.fromhex(line.charAt(j*2)) << 4) +
+                                                 Altos.fromhex(line.charAt(j*2+1)));
                        start += this_time;
                        i += this_time;
                }
@@ -199,7 +164,7 @@ public class AltosDebug extends AltosSerial {
                        String line = get_reply().trim();
                        String tokens[] = line.split("\\s+");
                        for (int j = 0; j < tokens.length; j++) {
-                               if (!ishex(tokens[j]) ||
+                               if (!Altos.ishex(tokens[j]) ||
                                    tokens[j].length() != 2)
                                        throw new IOException(
                                                String.format
index a60dc69..4d82de7 100644 (file)
@@ -20,10 +20,16 @@ package altosui;
 import java.text.*;
 import java.lang.*;
 
+import altosui.Altos;
+
 public class AltosParse {
+       static boolean isdigit(char c) {
+               return '0' <= c && c <= '9';
+       }
+
        static int parse_int(String v) throws ParseException {
                try {
-                       return Integer.parseInt(v);
+                       return Altos.fromdec(v);
                } catch (NumberFormatException e) {
                        throw new ParseException("error parsing int " + v, 0);
                }
@@ -31,7 +37,7 @@ public class AltosParse {
 
        static int parse_hex(String v) throws ParseException {
                try {
-                       return Integer.parseInt(v, 16);
+                       return Altos.fromhex(v);
                } catch (NumberFormatException e) {
                        throw new ParseException("error parsing hex " + v, 0);
                }