This source file includes following definitions.
- apply_towlower
- apply_tolower
- mbmemcasecoll
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <config.h>
19
20
21 #include "mbmemcasecoll.h"
22
23 #include <errno.h>
24 #include <stdlib.h>
25 #include <string.h>
26
27
28 #include <ctype.h>
29
30
31 #include <wchar.h>
32
33
34 #include <wctype.h>
35
36 #include "malloca.h"
37 #include "memcmp2.h"
38 #include "memcoll.h"
39
40 #define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
41
42
43
44 static size_t
45 apply_towlower (const char *inbuf, size_t inbufsize,
46 char *outbuf, size_t outbufsize)
47 {
48 char *outbuf_orig = outbuf;
49 size_t remaining;
50
51 remaining = inbufsize;
52 while (remaining > 0)
53 {
54 wchar_t wc1;
55 size_t n1;
56 mbstate_t state;
57
58 memset (&state, '\0', sizeof (mbstate_t));
59 n1 = mbrtowc (&wc1, inbuf, remaining, &state);
60 if (n1 == (size_t)(-2))
61 break;
62 if (n1 != (size_t)(-1))
63 {
64 wint_t wc2;
65
66 if (n1 == 0)
67 n1 = 1;
68
69 wc2 = towlower (wc1);
70 if (wc2 != wc1)
71 {
72 size_t n2;
73
74 memset (&state, '\0', sizeof (mbstate_t));
75 n2 = wcrtomb (outbuf, wc2, &state);
76 if (n2 != (size_t)(-1))
77 {
78
79 inbuf += n1;
80 remaining -= n1;
81 outbuf += n2;
82 continue;
83 }
84 }
85
86
87 memcpy (outbuf, inbuf, n1);
88 inbuf += n1;
89 remaining -= n1;
90 outbuf += n1;
91 continue;
92 }
93
94
95
96 *outbuf++ = *inbuf++;
97 remaining -= 1;
98 }
99
100
101 while (remaining > 0)
102 {
103 *outbuf++ = *inbuf++;
104 remaining -= 1;
105 }
106
107
108 if (outbuf - outbuf_orig > outbufsize)
109 abort ();
110
111
112 return outbuf - outbuf_orig;
113 }
114
115
116
117 static void
118 apply_tolower (const char *inbuf, char *outbuf, size_t bufsize)
119 {
120 for (; bufsize > 0; bufsize--)
121 {
122 *outbuf = TOLOWER ((unsigned char) *inbuf);
123 inbuf++;
124 outbuf++;
125 }
126 }
127
128 int
129 mbmemcasecoll (const char *s1, size_t s1len, const char *s2, size_t s2len,
130 bool hard_LC_COLLATE)
131 {
132 char *t1;
133 size_t t1len;
134 char *t2;
135 size_t t2len;
136 char *memory;
137 int cmp;
138
139 if (MB_CUR_MAX > 1)
140 {
141
142
143 t1len = 2 * s1len;
144 t2len = 2 * s2len;
145 }
146 else
147 {
148
149 t1len = s1len;
150 t2len = s2len;
151 }
152
153 memory = (char *) malloca (t1len + 1 + t2len + 1);
154 if (memory == NULL)
155 {
156 errno = ENOMEM;
157 return 0;
158 }
159 t1 = memory;
160 t2 = memory + t1len + 1;
161
162
163 if (MB_CUR_MAX > 1)
164 {
165 t1len = apply_towlower (s1, s1len, t1, t1len);
166 t2len = apply_towlower (s2, s2len, t2, t2len);
167 }
168 else
169 {
170 apply_tolower (s1, t1, s1len);
171 apply_tolower (s2, t2, s2len);
172 }
173
174
175 if (hard_LC_COLLATE)
176 cmp = memcoll (t1, t1len, t2, t2len);
177 else
178 {
179 cmp = memcmp2 (t1, t1len, t2, t2len);
180 errno = 0;
181 }
182
183 {
184 int saved_errno = errno;
185 freea (memory);
186 errno = saved_errno;
187 }
188
189 return cmp;
190 }