runetype.c.patch   [plain text]


--- runetype.c.orig	Tue May 20 15:21:44 2003
+++ runetype.c	Tue Jun 17 17:50:43 2003
@@ -39,27 +39,39 @@
 
 #include <stdio.h>
 #include <rune.h>
+#include <stdlib.h>
+
+__private_extern__ int
+__compRuneEntry(const void *rune, const void *range)
+{
+	__ct_rune_t c = *(__ct_rune_t *)rune;
+	_RuneEntry *re = (_RuneEntry *)range;
+
+	if (c < re->min)
+		return(-1);
+	if (c > re->max)
+		return(1);
+	return(0);
+}
 
 unsigned long
 ___runetype(c)
 	__ct_rune_t c;
 {
-	int x;
 	_RuneRange *rr = &_CurrentRuneLocale->runetype_ext;
-	_RuneEntry *re = rr->ranges;
+	_RuneEntry *re;
 
 	if (c < 0 || c == EOF)
 		return(0L);
 
-	for (x = 0; x < rr->nranges; ++x, ++re) {
-		if (c < re->min)
-			return(0L);
-		if (c <= re->max) {
-			if (re->types)
-			    return(re->types[c - re->min]);
-			else
-			    return(re->map);
-		}
+	re = (_RuneEntry *)bsearch(&c, rr->ranges, rr->nranges,
+	    sizeof(_RuneEntry), __compRuneEntry);
+
+	if (re) {
+		if (re->types)
+			return(re->types[c - re->min]);
+		else
+			return(re->map);
 	}
 
 	return(0L);