*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/locale/collcmp.c,v 1.14 2002/03/22 21:52:18 obrien Exp $");
+__FBSDID("$FreeBSD: src/lib/libc/locale/collcmp.c,v 1.18 2005/02/27 14:54:23 phantom Exp $");
-#define ASCII_COMPATIBLE_COLLATE /* see share/colldef */
-
-#include <string.h>
+#include <xlocale.h>
+#include <wchar.h>
#include "collate.h"
-#ifndef ASCII_COMPATIBLE_COLLATE
-#include <ctype.h>
-#endif
/*
- * Compare two characters converting collate information
- * into ASCII-compatible range, it allows to handle
- * "[a-z]"-type ranges with national characters.
+ * Compare two characters using collate
*/
-int __collate_range_cmp (c1, c2)
- int c1, c2;
+__private_extern__ int
+__collate_range_cmp(wchar_t c1, wchar_t c2, locale_t loc)
{
- static char s1[2], s2[2];
- int ret;
-#ifndef ASCII_COMPATIBLE_COLLATE
- int as1, as2, al1, al2;
-#endif
-
- c1 &= UCHAR_MAX;
- c2 &= UCHAR_MAX;
- if (c1 == c2)
- return (0);
-
-#ifndef ASCII_COMPATIBLE_COLLATE
- as1 = isascii(c1);
- as2 = isascii(c2);
- al1 = isalpha(c1);
- al2 = isalpha(c2);
+ static wchar_t s1[2], s2[2];
- if (as1 || as2 || al1 || al2) {
- if ((as1 && as2) || (!al1 && !al2))
- return (c1 - c2);
- if (al1 && !al2) {
- if (isupper(c1))
- return ('A' - c2);
- else
- return ('a' - c2);
- } else if (al2 && !al1) {
- if (isupper(c2))
- return (c1 - 'A');
- else
- return (c1 - 'a');
- }
- }
-#endif
s1[0] = c1;
s2[0] = c2;
- if ((ret = strcoll(s1, s2)) != 0)
- return (ret);
- return (c1 - c2);
+ return (wcscoll_l(s1, s2, loc));
}