import java.io.*;

/**
 * Einfache Klasse, die Konsoleneingaben entgegennimmt.
 *
 * @author AG Betriebssysteme
 * @version $Revision: 1.2 $
 */
public abstract class Input {

  private static BufferedReader m_reader;

  static {
    try {
      m_reader = new BufferedReader(new InputStreamReader(System.in));
    }
    catch (Throwable e) {
      System.out.println("Warnung: Konsoleneingabe nicht moeglich.");
    }
  }

  /**
   * Wartet auf Tastatureingaben, von einem Zeilenumbruch abgeschlossen
   * und interpretiert die Eingabe als <code>long</code>-Wert.
   *
   * @return Der eingegebene <code>long</code>-Wert.
   */
  public static long readLong () {
    try {
      return Long.parseLong(readln());
    }
    catch (Throwable e) {
      return 0L;
    }
  }

  /**
   * Wartet auf Tastatureingaben, von einem Zeilenumbruch abgeschlossen
   * und interpretiert die Eingabe als <code>double</code>-Wert.
   *
   * @return Der eingegebene <code>double</code>-Wert.
   */
  public static double readDouble() {
    try {
      return Double.parseDouble(readln());
    }
    catch (Throwable e) {
      return 0d;
    }
  }

  /**
   * Wartet auf Tastatureingaben, von einem Zeilenumbruch abgeschlossen
   * und interpretiert die Eingabe als <code>float</code>-Wert.
   *
   * @return Der eingegebene <code>float</code>-Wert.
   */
  public static float readFloat() {
    try {
      return Float.parseFloat(readln());
    }
    catch (Throwable e) {
      return 0f;
    }
  }

  /**
   * Wartet auf Tastatureingaben, von einem Zeilenumbruch abgeschlossen
   * und interpretiert die Eingabe als <code>int</code>-Wert.
   *
   * @return Der eingegebene <code>int</code>-Wert.
   */
  public static int readInt() {
    try {
      return Integer.parseInt(readln());
    }
    catch (Throwable e) {
      return 0;
    }
  }

  /**
   * Wartet auf Tastatureingaben, von einem Zeilenumbruch abgeschlossen
   * und interpretiert die Eingabe als <code>char</code>-Wert. Es wird nur
   * das erste Zeichen berücksichtigt.
   *
   * @return Der eingegebene <code>char</code>-Wert.
   */
  public static char readChar() {
    try {
      return readln().charAt(0);
    }
    catch (Throwable e) {
      return (char)0;
    }
  }

  /**
   * Wartet auf Tastatureingaben, von einem Zeilenumbruch abgeschlossen
   * und interpretiert die Eingabe als <code>boolean</code>-Wert.
   * Folgende Eingaben werden als <code>true</code> interpretiert:
   * <ul>
   * <li><code>1</code>
   * <li><code>y</code>
   * <li><code>t</code>
   * <li><code>j</code>
   * <li><code>w</code>
   * <li><code>yes</code>
   * <li><code>true</code>
   * <li><code>ja</code>
   * <li><code>wahr</code>
   * <li><code>ok</code>
   * </ul>
   * Groß- und Kleinschreibung wird nicht unterschieden.
   * Alle anderen Eingaben werden als <code>false</code> interpretiert.
   *
   * @return Der eingegebene <code>boolean</code>-Wert.
   */
  public static boolean readBoolean() {
    try {
      final String[] trueValues =
      { "1", "y", "t", "j", "w", "yes", "true", "ja", "wahr", "ok" };
      String input = readln().toLowerCase();
      for (int index = 0; index < trueValues.length; ++index) {
	if (trueValues[index].equals(input)) {
	  return true;
	}
      }
    }
    catch (Throwable e) {
    }
    return false;
  }

  private static String readln () {
    try {
      return m_reader.readLine();
    }
    catch (Throwable e) {
      return "";
    }
  }
}
