extern (C) putchar (c : char);

/**
   Affiche un int.   
 */
def print (i : long) : void {
    if (i < 0) {
	system (print_c, '-');
	print (- i);
    } else {
	if (i > 9) print (i / 10);
	system (print_c, (i%10) + '0');
    }
}

/**
   Affiche un long
 */
def print (i : int) : void {
    if (i < 0) {
	system (print_c, '-');
	print (- i);
    } else {
	if (i > 9) print (i / 10);
	system (print_c, (i%10) + '0');
    }
}

/**
   Affiche un char.
 */
def print (c : char)
    putchar (c);

/**
   Affiche un string.
 */
def print (s : string)
    for (it in s)
	print (it);

/**
   Transforme un char en string
 */
def toStr (c : char) 
    return cast:string ([c]);


/**
   Todo, ca marche pas pour les grande pr√©cision.
 */
def print (a : float, prec : int) {
    let i = cast:long (a * (exp (10, prec)));
    let ret = "", inf = false;
    if (i < 0) {
	inf = true;
	i = -i;
    }
    
    while (i > 9) {
	ret = toStr((i%10) + '0') + ret;
	i /= 10;
	prec --;
	if (prec == 0) ret = "." + ret;
    }

    ret = toStr((i%10) + '0') + ret;
    if (prec >= 1) ret = "." + ret;
    
    if (inf) print( "-" + ret);
    else print (ret);    
}

/**
   Returns: x ^^ n
 */
def exp (x, n) {
    let aux = x;
    for (i in 0 .. (n - 1))
	aux *= x;
    return aux;
}

/**
   Affiche in float
 */
def print (f : float) {
    print (f, 5);
}

/**
   Affiche elem, suivi de '\n'
 */
def println (elem) {
    print (elem);
    print ('\n');
}
