Patch fixes the bug. OK?
Richard -- ================================================================== Richard G Heck, Jr Professor of Philosophy Brown University http://frege.brown.edu/heck/ ================================================================== Get my public key from http://sks.keyserver.penguin.de Hash: 0x1DE91F1E66FFBDEC Learn how to sign your email using Thunderbird and GnuPG at: http://dudu.dyn.2-h.org/nist/gpg-enigmail-howto
Index: Counters.cpp =================================================================== --- Counters.cpp (revision 19362) +++ Counters.cpp (working copy) @@ -243,33 +243,71 @@ } -docstring const lowerromanCounter(int const n) + +docstring const romanCounter(int const n, bool lowercase = false) { - static char const * const roman[20] = { - "i", "ii", "iii", "iv", "v", - "vi", "vii", "viii", "ix", "x", - "xi", "xii", "xiii", "xiv", "xv", - "xvi", "xvii", "xviii", "xix", "xx" + static char const * const ones[9] = { + "I", "II", "III", "IV", "V", + "VI", "VII", "VIII", "IX" }; - - if (n < 1 || n > 20) + + static char const * const tens[9] = { + "X", "XX", "XXX", "XL", "L", + "LX", "LXX", "LXXX", "XC" + }; + + static char const * const hunds[9] = { + "C", "CC", "CCC", "CD", "D", + "DC", "DCC", "DCCC", "CM" + }; + + if (n > 1000 || n < 1) return from_ascii("??"); - return from_ascii(roman[n - 1]); + + int val = n; + string roman; + switch (n) { + //special cases + case 999: + roman = "IM"; + break; + case 499: + roman = "ID"; + break; + default: + if (val >= 100) { + int hundreds = val / 100; + roman = hunds[hundreds - 1]; + val = val % 100; + } + if (val >= 10) { + switch (val) { + //special cases + case 99: + roman = roman + "IC"; + val = 0; //skip next + break; + case 49: + roman = roman + "IL"; + val = 0; //skip next + break; + default: + int tensnum = val / 10; + roman = roman + tens[tensnum - 1]; + val = val % 10; + } // end switch + } // end tens + if (val > 0) + roman = roman + ones[val -1]; + } + docstring retval = from_ascii(roman); + return lowercase ? support::lowercase(retval) : retval; } -docstring const romanCounter(int const n) +docstring const lowerromanCounter(int const n) { - static char const * const roman[20] = { - "I", "II", "III", "IV", "V", - "VI", "VII", "VIII", "IX", "X", - "XI", "XII", "XIII", "XIV", "XV", - "XVI", "XVII", "XVIII", "XIX", "XX" - }; - - if (n < 1 || n > 20) - return from_ascii("??"); - return from_ascii(roman[n - 1]); + return romanCounter(n, true); } } // namespace anon