// package cs1;



//********************************************************************

//  Keyboard.java       Author: Lewis and Loftus

//

//  Facilitates keyboard input by abstracting details about input

//  parsing, conversions, and exception handling.

//********************************************************************



import java.io.*;

import java.util.*;



public class Keyboard 

{

   //*************  Error Handling Section  **************************



   private static boolean printErrors = true;

   private static int errorCount = 0;



   //-----------------------------------------------------------------

   //  Returns the current error count.

   //-----------------------------------------------------------------

   public static int getErrorCount()

   {

      return errorCount;

   }



   //-----------------------------------------------------------------

   //  Resets the current error count to zero.

   //-----------------------------------------------------------------

   public static void resetErrorCount (int count)

   {

      errorCount = 0;

   }



   //-----------------------------------------------------------------

   //  Returns a boolean indicating whether input errors are

   //  currently printed to standard output.

   //-----------------------------------------------------------------

   public static boolean getPrintErrors()

   {

      return printErrors;

   }



   //-----------------------------------------------------------------

   //  Sets a boolean indicating whether input errors are to be

   //  printed to standard output.

   //-----------------------------------------------------------------

   public static void setPrintErrors (boolean flag)

   {

      printErrors = flag;

   }



   //-----------------------------------------------------------------

   //  Increments the error count and prints the error message if

   //  appropriate.

   //-----------------------------------------------------------------

   private static void error (String str)

   {

      errorCount++;

      if (printErrors) 

         System.out.println (str);

   }



   //*************  Tokenized Input Stream Section  ******************



   private static String current_token = null;

   private static StringTokenizer reader;



   private static BufferedReader in = new BufferedReader 

      (new InputStreamReader(System.in));





   //-----------------------------------------------------------------

   //  Gets the next input token assuming it may be on subsequent

   //  input lines.

   //-----------------------------------------------------------------

   private static String getNextToken() 

   {

      return getNextToken (true);

   }



   //-----------------------------------------------------------------

   //  Gets the next input token, which may already have been read.

   //-----------------------------------------------------------------

   private static String getNextToken (boolean skip) 

   {

      String token;



      if (current_token == null)

         token = getNextInputToken (skip);

      else

      {

         token = current_token;

         current_token = null;

      }



      return token;

   }



   //-----------------------------------------------------------------

   //  Gets the next token from the input, which may come from the

   //  current input line or a subsequent one. The parameter

   //  determines if subsequent lines are used.

   //-----------------------------------------------------------------

   private static String getNextInputToken (boolean skip) 

   {

      final String delimiters = " \t\n\r\f";

      String token = null;



      try 

      {

         if (reader == null) 

            reader = new StringTokenizer 

               (in.readLine(), delimiters, true);



         while (token == null || 

                ((delimiters.indexOf (token) >= 0) && skip))

         {

            while (!reader.hasMoreTokens()) 

               reader = new StringTokenizer 

                  (in.readLine(), delimiters,true);

         

            token = reader.nextToken();

         }

      }

      catch (Exception exception) 

      {

         token = null;

      }



      return token;

   }



   //-----------------------------------------------------------------

   //  Returns true if there are no more tokens to read on the

   //  current input line.

   //-----------------------------------------------------------------

   public static boolean endOfLine() 

   {

      return !reader.hasMoreTokens();

   }



   //*************  Reading Section  *********************************



   //-----------------------------------------------------------------

   //  Returns a string read from standard input.

   //-----------------------------------------------------------------

   public static String readString() 

   {

      String str;



      try 

      {

         str = getNextToken(false);

         while (! endOfLine())

         {

            str = str + getNextToken(false);

         }

      }

      catch (Exception exception) 

      {

         error ("Error reading String data, null value returned.");

         str = null;

      }

      return str;

   }



   //-----------------------------------------------------------------

   //  Returns a space-delimited substring (a word) read from

   //  standard input.

   //-----------------------------------------------------------------

   public static String readWord() 

   {

      String token;

      try 

      {

         token = getNextToken();

      } 

      catch (Exception exception) 

      {

         error ("Error reading String data, null value returned.");

         token = null;

      }

      return token;

   }



   //-----------------------------------------------------------------

   //  Returns a boolean read from standard input.

   //-----------------------------------------------------------------

   public static boolean readBoolean() 

   {

      String token = getNextToken();

      boolean bool;

      try

      {

         if (token.toLowerCase().equals("true")) 

            bool = true;

         else if (token.toLowerCase().equals("false")) 

            bool = false;

         else 

         {

            error ("Error reading boolean data, false value returned.");

            bool = false;

         }

      }

      catch (Exception exception)

      {

         error ("Error reading boolean data, false value returned.");

         bool = false;

      }

      return bool;

   }



   //-----------------------------------------------------------------

   //  Returns a character read from standard input.

   //-----------------------------------------------------------------

   public static char readChar() 

   {

      String token = getNextToken(false);

      char value;

      try 

      {

         if (token.length() > 1)

         {

            current_token = token.substring (1, token.length());

         } else

            current_token = null;



         value = token.charAt (0);

      } 

      catch (Exception exception) 

      {

         error ("Error reading char data, MIN_VALUE value returned.");

         value = Character.MIN_VALUE;

      }



      return value;

   }



   //-----------------------------------------------------------------

   //  Returns an integer read from standard input.

   //-----------------------------------------------------------------

   public static int readInt() 

   {

      String token = getNextToken();

      int value;

      try 

      {

         value = Integer.parseInt (token);

      } 

      catch (Exception exception) 

      {

         error ("Error reading int data, MIN_VALUE value returned.");

         value = Integer.MIN_VALUE;

      }

      return value;

   }



   //-----------------------------------------------------------------

   //  Returns a long integer read from standard input.

   //-----------------------------------------------------------------

   public static long readLong() 

   {

      String token = getNextToken();

      long value;

      try 

      {

         value = Long.parseLong (token);

      } 

      catch (Exception exception) 

      {

         error ("Error reading long data, MIN_VALUE value returned.");

         value = Long.MIN_VALUE;

      }

      return value;

   }



   //-----------------------------------------------------------------

   //  Returns a float read from standard input.

   //-----------------------------------------------------------------

   public static float readFloat() 

   {

      String token = getNextToken();

      float value;

      try 

      {

         value = (new Float(token)).floatValue();

      } 

      catch (Exception exception) 

      {

         error ("Error reading float data, NaN value returned.");

         value = Float.NaN;

      }

      return value;

   }



   //-----------------------------------------------------------------

   //  Returns a double read from standard input.

   //-----------------------------------------------------------------

   public static double readDouble() 

   {

      String token = getNextToken();

      double value;

      try 

      {

         value = (new Double(token)).doubleValue();

      } 

      catch (Exception exception) 

      {

         error ("Error reading double data, NaN value returned.");

         value = Double.NaN;

      }

      return value;

   }

}

