package com.revolsys.io; import java.io.IOException; import java.io.Reader; import com.revolsys.util.Exceptions; public interface Readers { static double readDouble(final Reader reader) throws IOException { int digitCount = 0; long number = 0; boolean negative = false; double decimalDivisor = -1; for (int character = reader.read(); character != -1; character = reader.read()) { if (Character.isWhitespace(character)) { if (digitCount > 0) { break; } } else if (character == '.') { if (decimalDivisor == -1) { decimalDivisor = 1; } else { throw new IllegalStateException("Cannot have two '.' characters in a number"); } } else if (character == '-') { if (digitCount == 0 && !negative) { negative = true; } else { throw new IllegalStateException("Cannot have two '-' characters in a number"); } } else if (character >= '0' && character <= '9') { digitCount++; if (digitCount < 19) { number = number * 10 + character - '0'; if (decimalDivisor != -1) { decimalDivisor *= 10; } } } else { throw new IllegalStateException("Cannot have a '" + character + "' character in a number"); } } if (digitCount == 0) { return Double.NaN; } else { double doubleNumber; if (decimalDivisor > 1) { doubleNumber = number / decimalDivisor; } else { doubleNumber = number; } if (negative) { return -doubleNumber; } else { return doubleNumber; } } } static float readFloat(final Reader reader) throws IOException { int digitCount = 0; long number = 0; boolean negative = false; float decimalDivisor = -1; for (int character = reader.read(); character != -1; character = reader.read()) { if (Character.isWhitespace(character)) { if (digitCount > 0) { break; } } else if (character == '.') { if (decimalDivisor == -1) { decimalDivisor = 1; } else { throw new IllegalStateException("Cannot have two '.' characters in a number"); } } else if (character == '-') { if (digitCount == 0 && !negative) { negative = true; } else { throw new IllegalStateException("Cannot have two '-' characters in a number"); } } else if (character >= '0' && character <= '9') { digitCount++; if (digitCount < 19) { number = number * 10 + character - '0'; if (decimalDivisor != -1) { decimalDivisor *= 10; } } } else { throw new IllegalStateException("Cannot have a '" + character + "' character in a number"); } } if (digitCount == 0) { return Float.NaN; } else { float floatNumber; if (decimalDivisor > 1) { floatNumber = number / decimalDivisor; } else { floatNumber = number; } if (negative) { return -floatNumber; } else { return floatNumber; } } } public static int readInteger(final Reader reader) throws IOException { int digitCount = 0; int number = 0; boolean negative = false; for (int character = reader.read(); character != -1; character = reader.read()) { if (Character.isWhitespace(character)) { if (digitCount > 0) { break; } } else if (character == '-') { if (digitCount == 0 && !negative) { negative = true; } else { throw new IllegalStateException("Cannot have two '-' characters in a number"); } } else if (character >= '0' && character <= '9') { number = number * 10 + character - '0'; digitCount++; } else { throw new IllegalStateException("Cannot have a '" + character + "' character in a number"); } } if (digitCount == 0) { throw new IllegalStateException("Reader does not contain a number"); } else if (negative) { return -number; } else { return number; } } static String readKeyword(final Reader reader) { try { final StringBuilder string = new StringBuilder(); for (int character = reader.read(); character != -1; character = reader.read()) { if (Character.isWhitespace(character)) { if (string.length() > 0) { break; } } else { string.append((char)character); } } return string.toString(); } catch (final IOException e) { throw Exceptions.wrap(e); } } }