package library;
import java.io.*;

/** Quelques méthodes pour lire des entiers et des réels.
  * @author	Xavier Crégut (très largement inspiré par Cay Horstmann)
  * @version	1.1
  */
public class Console
{
    /** Afficher un prompt à l'écran (sans passage à la ligne)
      * @param prompt	texte à afficher à l'écran
      */
    public static void printPrompt(String prompt) {
	System.out.print(prompt + " ");
	System.out.flush();	// forcer l'écriture en l'absence de '\n'
    }
   
   /** Lire une chaîne de caractères à partir du clavier.  La chaîne de
     * caractères est terminée par un retour à la ligne (qui ne fait pas partie
     * du résultat).  (cf corejava)
     *
     * @return la ligne lue à partir du clavier (sans le retour à la ligne)
     */
    public static String readLine() {
	int ch;
	String r = "";
	boolean done = false;
	while (!done) {
	    try {
		ch = System.in.read();
		if (ch < 0 || (char) ch == '\n') {
		    done = true;
		} else if ((char) ch != '\r') {
			    // weird--it used to do \r\n translation
		    r = r + (char) ch;
		}
	    } catch (java.io.IOException e) {
		done = true;
	    }
	}
	return r;
    }

   /** Même méthode que readLine avec en plus l'affichage d'un prompt.
     * @param prompt	texte à afficher à l'écran
     * @return la ligne lue à partir du clavier (sans le retour à la ligne)
     */
    public static String readLine(String invite) {
	printPrompt(invite);
	return readLine();
    }

   /** Lire un entier à partir du clavier (équivalent du readln de Pascal).
     * Resaisie dans le cas d'une erreur de l'utilisateur.
     * @return l'entier lu
     */
    public static int readInt(String prompt) {
	int resultat = 0;
	boolean saisieOK = false;
	while(! saisieOK) {
	    printPrompt(prompt);
	    try {
		String s = readLine().trim();
		resultat = Integer.parseInt(s);
		saisieOK = true;
	    } catch (NumberFormatException e) {
		System.out.println ("Ce n'est pas un entier. Recommencez!");
	    }
	}
	return resultat;
    }

   /** Lire un réel à partir du clavier (équivalent du readln de Pascal).
     * Resaisie dans le cas d'une erreur de l'utilisateur.
     * @return l'entier lu
     */
    public static double readDouble(String prompt) {
	double resultat = 0;
	boolean saisieOK = false;
	while(! saisieOK) {
	    printPrompt(prompt);
	    try {
		String s = readLine().trim();
		resultat = Double.parseDouble(s);
		saisieOK = true;
	    } catch (NumberFormatException e) {
		System.out.println ("Ce n'est pas un réel. Recommencez!");
	    }
	}
	return resultat;
    }

   /** Lire un entier à partir du << flot >> d'entrée (équivalent du readln de Pascal).
     * Resaisie dans le cas d'une erreur de l'utilisateur.
     * @return l'entier lu
     */
   public static int readInt(BufferedReader in, String prompt) throws IOException {
	int resultat = 0;
	boolean saisieOK = false;
	while(! saisieOK) {
	    printPrompt(prompt);
	    try {
		String s = in.readLine().trim();
		resultat = Integer.parseInt(s);
		saisieOK = true;
	    } catch (NumberFormatException e) {
		System.out.println ("Ce n'est pas un entier. Recommencez!");
	    }
	}
	return resultat;
    }

}

