diff options
author | Calin Juravle <calin@google.com> | 2014-04-24 10:46:44 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-04-24 10:46:44 +0000 |
commit | 41f4f5501af5f216e4cc232b1b9d7c5a28a70d2a (patch) | |
tree | f7396204ef7090fb86274ba25a92bdf1a03779f3 /luni/src/main | |
parent | a6735a1f3cbe90f6f6555b4ebf10573a760bdb32 (diff) | |
parent | ae6e60bf18b455b1134b8b57a56b37cc588e179d (diff) | |
download | libcore-41f4f5501af5f216e4cc232b1b9d7c5a28a70d2a.zip libcore-41f4f5501af5f216e4cc232b1b9d7c5a28a70d2a.tar.gz libcore-41f4f5501af5f216e4cc232b1b9d7c5a28a70d2a.tar.bz2 |
Merge "Fix UUID#parseString in the presence of explicit + signs."
Diffstat (limited to 'luni/src/main')
-rw-r--r-- | luni/src/main/java/java/lang/Long.java | 33 | ||||
-rw-r--r-- | luni/src/main/java/java/util/UUID.java | 25 |
2 files changed, 40 insertions, 18 deletions
diff --git a/luni/src/main/java/java/lang/Long.java b/luni/src/main/java/java/lang/Long.java index 84169af..4ebc85b 100644 --- a/luni/src/main/java/java/lang/Long.java +++ b/luni/src/main/java/java/lang/Long.java @@ -378,6 +378,39 @@ public final class Long extends Number implements Comparable<Long> { return result; } + /** + * Equivalent to {@code parsePositiveLong(string, 10)}. + * + * @see #parsePositiveLong(String, int) + * + * @hide + */ + public static long parsePositiveLong(String string) throws NumberFormatException { + return parsePositiveLong(string, 10); + } + + /** + * Parses the specified string as a positive long value using the + * specified radix. 0 is considered a positive long. + * <p> + * This method behaves the same as {@link #parseLong(String, int)} except + * that it disallows leading '+' and '-' characters. See that method for + * error conditions. + * + * @see #parseLong(String, int) + * + * @hide + */ + public static long parsePositiveLong(String string, int radix) throws NumberFormatException { + if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) { + throw new NumberFormatException("Invalid radix: " + radix); + } + if (string == null || string.length() == 0) { + throw invalidLong(string); + } + return parse(string, 0, radix, false); + } + @Override public short shortValue() { return (short) value; diff --git a/luni/src/main/java/java/util/UUID.java b/luni/src/main/java/java/util/UUID.java index 3594d87..020ac95 100644 --- a/luni/src/main/java/java/util/UUID.java +++ b/luni/src/main/java/java/util/UUID.java @@ -182,28 +182,17 @@ public final class UUID implements Serializable, Comparable<UUID> { throw new NullPointerException("uuid == null"); } - int[] position = new int[5]; - int lastPosition = 1; - int startPosition = 0; - - int i = 0; - for (; i < position.length && lastPosition > 0; i++) { - position[i] = uuid.indexOf("-", startPosition); - lastPosition = position[i]; - startPosition = position[i] + 1; - } - - // should have and only can have four "-" in UUID - if (i != position.length || lastPosition != -1) { + String[] parts = uuid.split("-"); + if (parts.length != 5) { throw new IllegalArgumentException("Invalid UUID: " + uuid); } - long m1 = Long.parseLong(uuid.substring(0, position[0]), 16); - long m2 = Long.parseLong(uuid.substring(position[0] + 1, position[1]), 16); - long m3 = Long.parseLong(uuid.substring(position[1] + 1, position[2]), 16); + long m1 = Long.parsePositiveLong(parts[0], 16); + long m2 = Long.parsePositiveLong(parts[1], 16); + long m3 = Long.parsePositiveLong(parts[2], 16); - long lsb1 = Long.parseLong(uuid.substring(position[2] + 1, position[3]), 16); - long lsb2 = Long.parseLong(uuid.substring(position[3] + 1), 16); + long lsb1 = Long.parsePositiveLong(parts[3], 16); + long lsb2 = Long.parsePositiveLong(parts[4], 16); long msb = (m1 << 32) | (m2 << 16) | m3; long lsb = (lsb1 << 48) | lsb2; |