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

Reply via email to