summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2010-08-26 23:41:26 -0700
committerKeith Packard <keithp@keithp.com>2010-08-26 23:41:26 -0700
commitf0fd423d0bf83bc5c3f9d39e9c09397fbe8caed2 (patch)
tree641291f859fc6fb128a0da0575c23be2db1fc56d
parent68b2b66d7574dfd0bd5e3571b8ffad32ca5d2b73 (diff)
altosui: Move number parsing code to Altos general class
This moves these shared functions to the global shared class. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--ao-tools/altosui/Altos.java86
-rw-r--r--ao-tools/altosui/AltosDebug.java43
-rw-r--r--ao-tools/altosui/AltosParse.java10
3 files changed, 98 insertions, 41 deletions
diff --git a/ao-tools/altosui/Altos.java b/ao-tools/altosui/Altos.java
index 53359e23..07bd01ae 100644
--- a/ao-tools/altosui/Altos.java
+++ b/ao-tools/altosui/Altos.java
@@ -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;
+ }
}
diff --git a/ao-tools/altosui/AltosDebug.java b/ao-tools/altosui/AltosDebug.java
index 06c9a0bd..ca2e5a90 100644
--- a/ao-tools/altosui/AltosDebug.java
+++ b/ao-tools/altosui/AltosDebug.java
@@ -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
diff --git a/ao-tools/altosui/AltosParse.java b/ao-tools/altosui/AltosParse.java
index a60dc694..4d82de78 100644
--- a/ao-tools/altosui/AltosParse.java
+++ b/ao-tools/altosui/AltosParse.java
@@ -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);
}