12 #include "cln/integer.h"
13 #include "cln/integer_io.h"
14 #include "cln/abort.h"
18 void format_new_roman (std::ostream& stream, const cl_I& arg)
20 if (!(0 < arg && arg < 4000)) {
21 fprint(std::cerr, "format_new_roman: argument should be in the range 1 - 3999, not ");
22 fprint(std::cerr, arg);
23 fprint(std::cerr, ".\n");
26 var uintL value = cl_I_to_UL(arg);
27 struct roman { char symbol; uintL value; };
28 static const roman scale[7] = {
37 for (int i = 6; value > 0 /* && i >= 0 */ ; i--) {
38 var const roman * p = &scale[i];
39 var uintL multiplicity = floor(value,p->value);
40 value = value % p->value;
41 while (multiplicity > 0) {
42 fprintchar(stream,p->symbol);
47 // Must have i > 0 here.
48 var const roman * p_minor = &scale[(i-1) & ~1];
49 var uintL lowered_value = p->value - p_minor->value;
50 if (value >= lowered_value) {
51 fprintchar(stream,p_minor->symbol);
52 fprintchar(stream,p->symbol);
53 value = value - lowered_value;