// print_rational().

// General includes.
#include "cl_sysdep.h"

// Specification.
#include "cln/rational_io.h"


// Implementation.

#include "cln/output.h"
#include "cln/integer_io.h"
#include "cln/rational.h"
#include "cl_RA.h"

namespace cln {

void print_rational (std::ostream& stream, const cl_print_rational_flags& flags, const cl_RA& z)
{
	var unsigned int base = flags.rational_base;
	if (flags.rational_readably)
		// Radix-Specifier ausgeben:
		switch (base) {
		case 2:
			fprintchar(stream,'#');
			fprintchar(stream,'b');
			break;
		case 8:
			fprintchar(stream,'#');
			fprintchar(stream,'o');
			break;
		case 16:
			fprintchar(stream,'#');
			fprintchar(stream,'x');
			break;
		case 10:
			if (integerp(z)) {
				DeclareType(cl_I,z);
				// Basis 10 bei Integers durch
				// nachgestellten Punkt kennzeichnen:
				print_integer(stream,base,z);
				fprintchar(stream,'.');
				return;
			}
		default:
			// Basis in #nR-Schreibweise ausgeben:
			fprintchar(stream,'#');
			print_integer(stream,10,base);
			fprintchar(stream,'r');
			break;
		}
	if (integerp(z)) {
		DeclareType(cl_I,z);
		// Integer in Basis base ausgeben:
		print_integer(stream,base,z);
	} else {
		DeclareType(cl_RT,z);
		// Ratio in Basis base ausgeben; Zähler / Nenner
		print_integer(stream,base,numerator(z));
		fprintchar(stream,'/');
		print_integer(stream,base,denominator(z));
	}
}

}  // namespace cln
