toupper.c.patch   [plain text]


--- toupper.c.bsdnew	2009-11-09 15:05:25.000000000 -0800
+++ toupper.c	2009-11-09 17:30:20.000000000 -0800
@@ -32,22 +32,34 @@
 
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD: src/lib/libc/locale/toupper.c,v 1.13 2007/01/09 00:28:01 imp Exp $");
+  
+#include "xlocale_private.h"
 
 #include <ctype.h>
 #include <stdio.h>
 #include <runetype.h>
 
 __ct_rune_t
-___toupper(c)
+___toupper_l(c, loc)
 	__ct_rune_t c;
+	locale_t loc;
 {
 	size_t lim;
-	_RuneRange *rr = &_CurrentRuneLocale->__mapupper_ext;
+	_RuneRange *rr;
 	_RuneEntry *base, *re;
 
 	if (c < 0 || c == EOF)
 		return(c);
 
+	NORMALIZE_LOCALE(loc);
+	/*
+	 * the following is not used by toupper(), but can be used by
+	 * toupper_l().  This provides the oppurtunity to optimize toupper()
+	 * when compatibility for Panther and lower is no longer needed
+	 */
+	if (c < _CACHED_RUNES)
+		return loc->__lc_ctype->_CurrentRuneLocale.__mapupper[c];
+	rr = &loc->__lc_ctype->_CurrentRuneLocale.__mapupper_ext;
 	/* Binary search -- see bsearch.c for explanation. */
 	base = rr->__ranges;
 	for (lim = rr->__nranges; lim != 0; lim >>= 1) {
@@ -62,3 +74,10 @@ ___toupper(c)
 
 	return(c);
 }
+
+__ct_rune_t
+___toupper(c)
+	__ct_rune_t c;
+{
+	return ___toupper_l(c, __current_locale());
+}