]> git.saurik.com Git - apple/libc.git/blame - string/FreeBSD/strcoll.c.patch
Libc-498.1.1.tar.gz
[apple/libc.git] / string / FreeBSD / strcoll.c.patch
CommitLineData
3d9156a7 1--- strcoll.c.orig 2003-05-20 15:23:54.000000000 -0700
224c7076
A
2+++ strcoll.c 2005-03-30 15:16:28.000000000 -0800
3@@ -28,59 +28,44 @@
3d9156a7
A
4 #include <sys/cdefs.h>
5 __FBSDID("$FreeBSD: src/lib/libc/string/strcoll.c,v 1.13 2001/11/07 19:55:16 obrien Exp $");
6
7+#include "xlocale_private.h"
8+
9 #include <stdlib.h>
10 #include <string.h>
224c7076
A
11+#include <wchar.h>
12+#include <errno.h>
3d9156a7
A
13 #include "collate.h"
14
15 int
16-strcoll(s, s2)
17+strcoll_l(s, s2, loc)
18 const char *s, *s2;
19+ locale_t loc;
20 {
224c7076
A
21- int len, len2, prim, prim2, sec, sec2, ret, ret2;
22- const char *t, *t2;
23- char *tt, *tt2;
24+ int ret;
25+ const wchar_t *t = NULL, *t2 = NULL;
26+ int sverrno;
3d9156a7
A
27
28- if (__collate_load_error)
29+ NORMALIZE_LOCALE(loc);
224c7076
A
30+ if (loc->__collate_load_error || (t = __collate_mbstowcs(s, loc)) == NULL || (t2 = __collate_mbstowcs(s2, loc)) == NULL) {
31+ sverrno = errno;
32+ free((void *)t);
33+ free((void *)t2);
34+ errno = sverrno;
3d9156a7 35 return strcmp(s, s2);
224c7076
A
36-
37- len = len2 = 1;
38- ret = ret2 = 0;
3d9156a7
A
39- if (__collate_substitute_nontrivial) {
40- t = tt = __collate_substitute(s);
41- t2 = tt2 = __collate_substitute(s2);
224c7076
A
42- } else {
43- tt = tt2 = NULL;
44- t = s;
45- t2 = s2;
46 }
47- while(*t && *t2) {
48- prim = prim2 = 0;
49- while(*t && !prim) {
3d9156a7 50- __collate_lookup(t, &len, &prim, &sec);
224c7076
A
51- t += len;
52- }
53- while(*t2 && !prim2) {
3d9156a7 54- __collate_lookup(t2, &len2, &prim2, &sec2);
224c7076
A
55- t2 += len2;
56- }
57- if(!prim || !prim2)
58- break;
59- if(prim != prim2) {
60- ret = prim - prim2;
61- goto end;
62- }
63- if(!ret2)
64- ret2 = sec - sec2;
65- }
66- if(!*t && *t2)
3d9156a7 67- ret = -(int)((u_char)*t2);
224c7076 68- else if(*t && !*t2)
3d9156a7 69- ret = (u_char)*t;
224c7076
A
70- else if(!*t && !*t2)
71- ret = ret2;
72- end:
73- free(tt);
74- free(tt2);
75+
76+ ret = wcscoll_l(t, t2, loc);
77+ sverrno = errno;
78+ free((void *)t);
79+ free((void *)t2);
80+ errno = sverrno;
3d9156a7
A
81
82 return ret;
83 }
84+
85+int
86+strcoll(s, s2)
87+ const char *s, *s2;
88+{
89+ return strcoll_l(s, s2, __current_locale());
90+}