]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - module/unicode/u8_textprep.c
Update OpenZFS to 2.0.0-rc3-gbd565f
[FreeBSD/FreeBSD.git] / module / unicode / u8_textprep.c
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25
26
27
28
29 /*
30  * UTF-8 text preparation functions (PSARC/2007/149, PSARC/2007/458).
31  *
32  * Man pages: u8_textprep_open(9F), u8_textprep_buf(9F), u8_textprep_close(9F),
33  * u8_textprep_str(9F), u8_strcmp(9F), and u8_validate(9F). See also
34  * the section 3C man pages.
35  * Interface stability: Committed.
36  */
37
38 #include <sys/types.h>
39 #include <sys/strings.h>
40 #include <sys/param.h>
41 #include <sys/sysmacros.h>
42 #include <sys/debug.h>
43 #include <sys/kmem.h>
44 #include <sys/sunddi.h>
45 #include <sys/u8_textprep.h>
46 #include <sys/byteorder.h>
47 #include <sys/errno.h>
48 #include <sys/u8_textprep_data.h>
49 #include <sys/mod.h>
50
51 /* The maximum possible number of bytes in a UTF-8 character. */
52 #define U8_MB_CUR_MAX                   (4)
53
54 /*
55  * The maximum number of bytes needed for a UTF-8 character to cover
56  * U+0000 - U+FFFF, i.e., the coding space of now deprecated UCS-2.
57  */
58 #define U8_MAX_BYTES_UCS2               (3)
59
60 /* The maximum possible number of bytes in a Stream-Safe Text. */
61 #define U8_STREAM_SAFE_TEXT_MAX         (128)
62
63 /*
64  * The maximum number of characters in a combining/conjoining sequence and
65  * the actual upperbound limit of a combining/conjoining sequence.
66  */
67 #define U8_MAX_CHARS_A_SEQ              (32)
68 #define U8_UPPER_LIMIT_IN_A_SEQ         (31)
69
70 /* The combining class value for Starter. */
71 #define U8_COMBINING_CLASS_STARTER      (0)
72
73 /*
74  * Some Hangul related macros at below.
75  *
76  * The first and the last of Hangul syllables, Hangul Jamo Leading consonants,
77  * Vowels, and optional Trailing consonants in Unicode scalar values.
78  *
79  * Please be noted that the U8_HANGUL_JAMO_T_FIRST is 0x11A7 at below not
80  * the actual U+11A8. This is due to that the trailing consonant is optional
81  * and thus we are doing a pre-calculation of subtracting one.
82  *
83  * Each of 19 modern leading consonants has total 588 possible syllables since
84  * Hangul has 21 modern vowels and 27 modern trailing consonants plus 1 for
85  * no trailing consonant case, i.e., 21 x 28 = 588.
86  *
87  * We also have bunch of Hangul related macros at below. Please bear in mind
88  * that the U8_HANGUL_JAMO_1ST_BYTE can be used to check whether it is
89  * a Hangul Jamo or not but the value does not guarantee that it is a Hangul
90  * Jamo; it just guarantee that it will be most likely.
91  */
92 #define U8_HANGUL_SYL_FIRST             (0xAC00U)
93 #define U8_HANGUL_SYL_LAST              (0xD7A3U)
94
95 #define U8_HANGUL_JAMO_L_FIRST          (0x1100U)
96 #define U8_HANGUL_JAMO_L_LAST           (0x1112U)
97 #define U8_HANGUL_JAMO_V_FIRST          (0x1161U)
98 #define U8_HANGUL_JAMO_V_LAST           (0x1175U)
99 #define U8_HANGUL_JAMO_T_FIRST          (0x11A7U)
100 #define U8_HANGUL_JAMO_T_LAST           (0x11C2U)
101
102 #define U8_HANGUL_V_COUNT               (21)
103 #define U8_HANGUL_VT_COUNT              (588)
104 #define U8_HANGUL_T_COUNT               (28)
105
106 #define U8_HANGUL_JAMO_1ST_BYTE         (0xE1U)
107
108 #define U8_SAVE_HANGUL_AS_UTF8(s, i, j, k, b) \
109         (s)[(i)] = (uchar_t)(0xE0U | ((uint32_t)(b) & 0xF000U) >> 12); \
110         (s)[(j)] = (uchar_t)(0x80U | ((uint32_t)(b) & 0x0FC0U) >> 6); \
111         (s)[(k)] = (uchar_t)(0x80U | ((uint32_t)(b) & 0x003FU));
112
113 #define U8_HANGUL_JAMO_L(u) \
114         ((u) >= U8_HANGUL_JAMO_L_FIRST && (u) <= U8_HANGUL_JAMO_L_LAST)
115
116 #define U8_HANGUL_JAMO_V(u) \
117         ((u) >= U8_HANGUL_JAMO_V_FIRST && (u) <= U8_HANGUL_JAMO_V_LAST)
118
119 #define U8_HANGUL_JAMO_T(u) \
120         ((u) > U8_HANGUL_JAMO_T_FIRST && (u) <= U8_HANGUL_JAMO_T_LAST)
121
122 #define U8_HANGUL_JAMO(u) \
123         ((u) >= U8_HANGUL_JAMO_L_FIRST && (u) <= U8_HANGUL_JAMO_T_LAST)
124
125 #define U8_HANGUL_SYLLABLE(u) \
126         ((u) >= U8_HANGUL_SYL_FIRST && (u) <= U8_HANGUL_SYL_LAST)
127
128 #define U8_HANGUL_COMPOSABLE_L_V(s, u) \
129         ((s) == U8_STATE_HANGUL_L && U8_HANGUL_JAMO_V((u)))
130
131 #define U8_HANGUL_COMPOSABLE_LV_T(s, u) \
132         ((s) == U8_STATE_HANGUL_LV && U8_HANGUL_JAMO_T((u)))
133
134 /* The types of decomposition mappings. */
135 #define U8_DECOMP_BOTH                  (0xF5U)
136 #define U8_DECOMP_CANONICAL             (0xF6U)
137
138 /* The indicator for 16-bit table. */
139 #define U8_16BIT_TABLE_INDICATOR        (0x8000U)
140
141 /* The following are some convenience macros. */
142 #define U8_PUT_3BYTES_INTO_UTF32(u, b1, b2, b3)  \
143         (u) = ((((uint32_t)(b1) & 0x0F) << 12) | \
144                 (((uint32_t)(b2) & 0x3F) << 6)  | \
145                 ((uint32_t)(b3) & 0x3F));
146
147 #define U8_SIMPLE_SWAP(a, b, t) \
148         (t) = (a); \
149         (a) = (b); \
150         (b) = (t);
151
152 #define U8_ASCII_TOUPPER(c) \
153         (((c) >= 'a' && (c) <= 'z') ? (c) - 'a' + 'A' : (c))
154
155 #define U8_ASCII_TOLOWER(c) \
156         (((c) >= 'A' && (c) <= 'Z') ? (c) - 'A' + 'a' : (c))
157
158 #define U8_ISASCII(c)                   (((uchar_t)(c)) < 0x80U)
159 /*
160  * The following macro assumes that the two characters that are to be
161  * swapped are adjacent to each other and 'a' comes before 'b'.
162  *
163  * If the assumptions are not met, then, the macro will fail.
164  */
165 #define U8_SWAP_COMB_MARKS(a, b) \
166         for (k = 0; k < disp[(a)]; k++) \
167                 u8t[k] = u8s[start[(a)] + k]; \
168         for (k = 0; k < disp[(b)]; k++) \
169                 u8s[start[(a)] + k] = u8s[start[(b)] + k]; \
170         start[(b)] = start[(a)] + disp[(b)]; \
171         for (k = 0; k < disp[(a)]; k++) \
172                 u8s[start[(b)] + k] = u8t[k]; \
173         U8_SIMPLE_SWAP(comb_class[(a)], comb_class[(b)], tc); \
174         U8_SIMPLE_SWAP(disp[(a)], disp[(b)], tc);
175
176 /* The possible states during normalization. */
177 typedef enum {
178         U8_STATE_START = 0,
179         U8_STATE_HANGUL_L = 1,
180         U8_STATE_HANGUL_LV = 2,
181         U8_STATE_HANGUL_LVT = 3,
182         U8_STATE_HANGUL_V = 4,
183         U8_STATE_HANGUL_T = 5,
184         U8_STATE_COMBINING_MARK = 6
185 } u8_normalization_states_t;
186
187 /*
188  * The three vectors at below are used to check bytes of a given UTF-8
189  * character are valid and not containing any malformed byte values.
190  *
191  * We used to have a quite relaxed UTF-8 binary representation but then there
192  * was some security related issues and so the Unicode Consortium defined
193  * and announced the UTF-8 Corrigendum at Unicode 3.1 and then refined it
194  * one more time at the Unicode 3.2. The following three tables are based on
195  * that.
196  */
197
198 #define U8_ILLEGAL_NEXT_BYTE_COMMON(c)  ((c) < 0x80 || (c) > 0xBF)
199
200 #define I_                              U8_ILLEGAL_CHAR
201 #define O_                              U8_OUT_OF_RANGE_CHAR
202
203 const int8_t u8_number_of_bytes[0x100] = {
204         1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
205         1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
206         1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
207         1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
208         1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
209         1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
210         1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
211         1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
212
213 /*      80  81  82  83  84  85  86  87  88  89  8A  8B  8C  8D  8E  8F  */
214         I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_,
215
216 /*      90  91  92  93  94  95  96  97  98  99  9A  9B  9C  9D  9E  9F  */
217         I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_,
218
219 /*      A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  AA  AB  AC  AD  AE  AF  */
220         I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_,
221
222 /*      B0  B1  B2  B3  B4  B5  B6  B7  B8  B9  BA  BB  BC  BD  BE  BF  */
223         I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_, I_,
224
225 /*      C0  C1  C2  C3  C4  C5  C6  C7  C8  C9  CA  CB  CC  CD  CE  CF  */
226         I_, I_, 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
227
228 /*      D0  D1  D2  D3  D4  D5  D6  D7  D8  D9  DA  DB  DC  DD  DE  DF  */
229         2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
230
231 /*      E0  E1  E2  E3  E4  E5  E6  E7  E8  E9  EA  EB  EC  ED  EE  EF  */
232         3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
233
234 /*      F0  F1  F2  F3  F4  F5  F6  F7  F8  F9  FA  FB  FC  FD  FE  FF  */
235         4,  4,  4,  4,  4,  O_, O_, O_, O_, O_, O_, O_, O_, O_, O_, O_,
236 };
237
238 #undef  I_
239 #undef  O_
240
241 const uint8_t u8_valid_min_2nd_byte[0x100] = {
242         0,    0,    0,    0,    0,    0,    0,    0,
243         0,    0,    0,    0,    0,    0,    0,    0,
244         0,    0,    0,    0,    0,    0,    0,    0,
245         0,    0,    0,    0,    0,    0,    0,    0,
246         0,    0,    0,    0,    0,    0,    0,    0,
247         0,    0,    0,    0,    0,    0,    0,    0,
248         0,    0,    0,    0,    0,    0,    0,    0,
249         0,    0,    0,    0,    0,    0,    0,    0,
250         0,    0,    0,    0,    0,    0,    0,    0,
251         0,    0,    0,    0,    0,    0,    0,    0,
252         0,    0,    0,    0,    0,    0,    0,    0,
253         0,    0,    0,    0,    0,    0,    0,    0,
254         0,    0,    0,    0,    0,    0,    0,    0,
255         0,    0,    0,    0,    0,    0,    0,    0,
256         0,    0,    0,    0,    0,    0,    0,    0,
257         0,    0,    0,    0,    0,    0,    0,    0,
258         0,    0,    0,    0,    0,    0,    0,    0,
259         0,    0,    0,    0,    0,    0,    0,    0,
260         0,    0,    0,    0,    0,    0,    0,    0,
261         0,    0,    0,    0,    0,    0,    0,    0,
262         0,    0,    0,    0,    0,    0,    0,    0,
263         0,    0,    0,    0,    0,    0,    0,    0,
264         0,    0,    0,    0,    0,    0,    0,    0,
265         0,    0,    0,    0,    0,    0,    0,    0,
266 /*      C0    C1    C2    C3    C4    C5    C6    C7    */
267         0,    0,    0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
268 /*      C8    C9    CA    CB    CC    CD    CE    CF    */
269         0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
270 /*      D0    D1    D2    D3    D4    D5    D6    D7    */
271         0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
272 /*      D8    D9    DA    DB    DC    DD    DE    DF    */
273         0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
274 /*      E0    E1    E2    E3    E4    E5    E6    E7    */
275         0xa0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
276 /*      E8    E9    EA    EB    EC    ED    EE    EF    */
277         0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
278 /*      F0    F1    F2    F3    F4    F5    F6    F7    */
279         0x90, 0x80, 0x80, 0x80, 0x80, 0,    0,    0,
280         0,    0,    0,    0,    0,    0,    0,    0,
281 };
282
283 const uint8_t u8_valid_max_2nd_byte[0x100] = {
284         0,    0,    0,    0,    0,    0,    0,    0,
285         0,    0,    0,    0,    0,    0,    0,    0,
286         0,    0,    0,    0,    0,    0,    0,    0,
287         0,    0,    0,    0,    0,    0,    0,    0,
288         0,    0,    0,    0,    0,    0,    0,    0,
289         0,    0,    0,    0,    0,    0,    0,    0,
290         0,    0,    0,    0,    0,    0,    0,    0,
291         0,    0,    0,    0,    0,    0,    0,    0,
292         0,    0,    0,    0,    0,    0,    0,    0,
293         0,    0,    0,    0,    0,    0,    0,    0,
294         0,    0,    0,    0,    0,    0,    0,    0,
295         0,    0,    0,    0,    0,    0,    0,    0,
296         0,    0,    0,    0,    0,    0,    0,    0,
297         0,    0,    0,    0,    0,    0,    0,    0,
298         0,    0,    0,    0,    0,    0,    0,    0,
299         0,    0,    0,    0,    0,    0,    0,    0,
300         0,    0,    0,    0,    0,    0,    0,    0,
301         0,    0,    0,    0,    0,    0,    0,    0,
302         0,    0,    0,    0,    0,    0,    0,    0,
303         0,    0,    0,    0,    0,    0,    0,    0,
304         0,    0,    0,    0,    0,    0,    0,    0,
305         0,    0,    0,    0,    0,    0,    0,    0,
306         0,    0,    0,    0,    0,    0,    0,    0,
307         0,    0,    0,    0,    0,    0,    0,    0,
308 /*      C0    C1    C2    C3    C4    C5    C6    C7    */
309         0,    0,    0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
310 /*      C8    C9    CA    CB    CC    CD    CE    CF    */
311         0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
312 /*      D0    D1    D2    D3    D4    D5    D6    D7    */
313         0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
314 /*      D8    D9    DA    DB    DC    DD    DE    DF    */
315         0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
316 /*      E0    E1    E2    E3    E4    E5    E6    E7    */
317         0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
318 /*      E8    E9    EA    EB    EC    ED    EE    EF    */
319         0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x9f, 0xbf, 0xbf,
320 /*      F0    F1    F2    F3    F4    F5    F6    F7    */
321         0xbf, 0xbf, 0xbf, 0xbf, 0x8f, 0,    0,    0,
322         0,    0,    0,    0,    0,    0,    0,    0,
323 };
324
325
326 /*
327  * The u8_validate() validates on the given UTF-8 character string and
328  * calculate the byte length. It is quite similar to mblen(3C) except that
329  * this will validate against the list of characters if required and
330  * specific to UTF-8 and Unicode.
331  */
332 int
333 u8_validate(const char *u8str, size_t n, char **list, int flag, int *errnum)
334 {
335         uchar_t *ib;
336         uchar_t *ibtail;
337         uchar_t **p;
338         uchar_t *s1;
339         uchar_t *s2;
340         uchar_t f;
341         int sz;
342         size_t i;
343         int ret_val;
344         boolean_t second;
345         boolean_t no_need_to_validate_entire;
346         boolean_t check_additional;
347         boolean_t validate_ucs2_range_only;
348
349         if (! u8str)
350                 return (0);
351
352         ib = (uchar_t *)u8str;
353         ibtail = ib + n;
354
355         ret_val = 0;
356
357         no_need_to_validate_entire = ! (flag & U8_VALIDATE_ENTIRE);
358         check_additional = flag & U8_VALIDATE_CHECK_ADDITIONAL;
359         validate_ucs2_range_only = flag & U8_VALIDATE_UCS2_RANGE;
360
361         while (ib < ibtail) {
362                 /*
363                  * The first byte of a UTF-8 character tells how many
364                  * bytes will follow for the character. If the first byte
365                  * is an illegal byte value or out of range value, we just
366                  * return -1 with an appropriate error number.
367                  */
368                 sz = u8_number_of_bytes[*ib];
369                 if (sz == U8_ILLEGAL_CHAR) {
370                         *errnum = EILSEQ;
371                         return (-1);
372                 }
373
374                 if (sz == U8_OUT_OF_RANGE_CHAR ||
375                     (validate_ucs2_range_only && sz > U8_MAX_BYTES_UCS2)) {
376                         *errnum = ERANGE;
377                         return (-1);
378                 }
379
380                 /*
381                  * If we don't have enough bytes to check on, that's also
382                  * an error. As you can see, we give illegal byte sequence
383                  * checking higher priority then EINVAL cases.
384                  */
385                 if ((ibtail - ib) < sz) {
386                         *errnum = EINVAL;
387                         return (-1);
388                 }
389
390                 if (sz == 1) {
391                         ib++;
392                         ret_val++;
393                 } else {
394                         /*
395                          * Check on the multi-byte UTF-8 character. For more
396                          * details on this, see comment added for the used
397                          * data structures at the beginning of the file.
398                          */
399                         f = *ib++;
400                         ret_val++;
401                         second = B_TRUE;
402                         for (i = 1; i < sz; i++) {
403                                 if (second) {
404                                         if (*ib < u8_valid_min_2nd_byte[f] ||
405                                             *ib > u8_valid_max_2nd_byte[f]) {
406                                                 *errnum = EILSEQ;
407                                                 return (-1);
408                                         }
409                                         second = B_FALSE;
410                                 } else if (U8_ILLEGAL_NEXT_BYTE_COMMON(*ib)) {
411                                         *errnum = EILSEQ;
412                                         return (-1);
413                                 }
414                                 ib++;
415                                 ret_val++;
416                         }
417                 }
418
419                 if (check_additional) {
420                         for (p = (uchar_t **)list, i = 0; p[i]; i++) {
421                                 s1 = ib - sz;
422                                 s2 = p[i];
423                                 while (s1 < ib) {
424                                         if (*s1 != *s2 || *s2 == '\0')
425                                                 break;
426                                         s1++;
427                                         s2++;
428                                 }
429
430                                 if (s1 >= ib && *s2 == '\0') {
431                                         *errnum = EBADF;
432                                         return (-1);
433                                 }
434                         }
435                 }
436
437                 if (no_need_to_validate_entire)
438                         break;
439         }
440
441         return (ret_val);
442 }
443
444 /*
445  * The do_case_conv() looks at the mapping tables and returns found
446  * bytes if any. If not found, the input bytes are returned. The function
447  * always terminate the return bytes with a null character assuming that
448  * there are plenty of room to do so.
449  *
450  * The case conversions are simple case conversions mapping a character to
451  * another character as specified in the Unicode data. The byte size of
452  * the mapped character could be different from that of the input character.
453  *
454  * The return value is the byte length of the returned character excluding
455  * the terminating null byte.
456  */
457 static size_t
458 do_case_conv(int uv, uchar_t *u8s, uchar_t *s, int sz, boolean_t is_it_toupper)
459 {
460         size_t i;
461         uint16_t b1 = 0;
462         uint16_t b2 = 0;
463         uint16_t b3 = 0;
464         uint16_t b3_tbl;
465         uint16_t b3_base;
466         uint16_t b4 = 0;
467         size_t start_id;
468         size_t end_id;
469
470         /*
471          * At this point, the only possible values for sz are 2, 3, and 4.
472          * The u8s should point to a vector that is well beyond the size of
473          * 5 bytes.
474          */
475         if (sz == 2) {
476                 b3 = u8s[0] = s[0];
477                 b4 = u8s[1] = s[1];
478         } else if (sz == 3) {
479                 b2 = u8s[0] = s[0];
480                 b3 = u8s[1] = s[1];
481                 b4 = u8s[2] = s[2];
482         } else if (sz == 4) {
483                 b1 = u8s[0] = s[0];
484                 b2 = u8s[1] = s[1];
485                 b3 = u8s[2] = s[2];
486                 b4 = u8s[3] = s[3];
487         } else {
488                 /* This is not possible but just in case as a fallback. */
489                 if (is_it_toupper)
490                         *u8s = U8_ASCII_TOUPPER(*s);
491                 else
492                         *u8s = U8_ASCII_TOLOWER(*s);
493                 u8s[1] = '\0';
494
495                 return (1);
496         }
497         u8s[sz] = '\0';
498
499         /*
500          * Let's find out if we have a corresponding character.
501          */
502         b1 = u8_common_b1_tbl[uv][b1];
503         if (b1 == U8_TBL_ELEMENT_NOT_DEF)
504                 return ((size_t)sz);
505
506         b2 = u8_case_common_b2_tbl[uv][b1][b2];
507         if (b2 == U8_TBL_ELEMENT_NOT_DEF)
508                 return ((size_t)sz);
509
510         if (is_it_toupper) {
511                 b3_tbl = u8_toupper_b3_tbl[uv][b2][b3].tbl_id;
512                 if (b3_tbl == U8_TBL_ELEMENT_NOT_DEF)
513                         return ((size_t)sz);
514
515                 start_id = u8_toupper_b4_tbl[uv][b3_tbl][b4];
516                 end_id = u8_toupper_b4_tbl[uv][b3_tbl][b4 + 1];
517
518                 /* Either there is no match or an error at the table. */
519                 if (start_id >= end_id || (end_id - start_id) > U8_MB_CUR_MAX)
520                         return ((size_t)sz);
521
522                 b3_base = u8_toupper_b3_tbl[uv][b2][b3].base;
523
524                 for (i = 0; start_id < end_id; start_id++)
525                         u8s[i++] = u8_toupper_final_tbl[uv][b3_base + start_id];
526         } else {
527                 b3_tbl = u8_tolower_b3_tbl[uv][b2][b3].tbl_id;
528                 if (b3_tbl == U8_TBL_ELEMENT_NOT_DEF)
529                         return ((size_t)sz);
530
531                 start_id = u8_tolower_b4_tbl[uv][b3_tbl][b4];
532                 end_id = u8_tolower_b4_tbl[uv][b3_tbl][b4 + 1];
533
534                 if (start_id >= end_id || (end_id - start_id) > U8_MB_CUR_MAX)
535                         return ((size_t)sz);
536
537                 b3_base = u8_tolower_b3_tbl[uv][b2][b3].base;
538
539                 for (i = 0; start_id < end_id; start_id++)
540                         u8s[i++] = u8_tolower_final_tbl[uv][b3_base + start_id];
541         }
542
543         /*
544          * If i is still zero, that means there is no corresponding character.
545          */
546         if (i == 0)
547                 return ((size_t)sz);
548
549         u8s[i] = '\0';
550
551         return (i);
552 }
553
554 /*
555  * The do_case_compare() function compares the two input strings, s1 and s2,
556  * one character at a time doing case conversions if applicable and return
557  * the comparison result as like strcmp().
558  *
559  * Since, in empirical sense, most of text data are 7-bit ASCII characters,
560  * we treat the 7-bit ASCII characters as a special case trying to yield
561  * faster processing time.
562  */
563 static int
564 do_case_compare(size_t uv, uchar_t *s1, uchar_t *s2, size_t n1,
565     size_t n2, boolean_t is_it_toupper, int *errnum)
566 {
567         int f;
568         int sz1;
569         int sz2;
570         size_t j;
571         size_t i1;
572         size_t i2;
573         uchar_t u8s1[U8_MB_CUR_MAX + 1];
574         uchar_t u8s2[U8_MB_CUR_MAX + 1];
575
576         i1 = i2 = 0;
577         while (i1 < n1 && i2 < n2) {
578                 /*
579                  * Find out what would be the byte length for this UTF-8
580                  * character at string s1 and also find out if this is
581                  * an illegal start byte or not and if so, issue a proper
582                  * error number and yet treat this byte as a character.
583                  */
584                 sz1 = u8_number_of_bytes[*s1];
585                 if (sz1 < 0) {
586                         *errnum = EILSEQ;
587                         sz1 = 1;
588                 }
589
590                 /*
591                  * For 7-bit ASCII characters mainly, we do a quick case
592                  * conversion right at here.
593                  *
594                  * If we don't have enough bytes for this character, issue
595                  * an EINVAL error and use what are available.
596                  *
597                  * If we have enough bytes, find out if there is
598                  * a corresponding uppercase character and if so, copy over
599                  * the bytes for a comparison later. If there is no
600                  * corresponding uppercase character, then, use what we have
601                  * for the comparison.
602                  */
603                 if (sz1 == 1) {
604                         if (is_it_toupper)
605                                 u8s1[0] = U8_ASCII_TOUPPER(*s1);
606                         else
607                                 u8s1[0] = U8_ASCII_TOLOWER(*s1);
608                         s1++;
609                         u8s1[1] = '\0';
610                 } else if ((i1 + sz1) > n1) {
611                         *errnum = EINVAL;
612                         for (j = 0; (i1 + j) < n1; )
613                                 u8s1[j++] = *s1++;
614                         u8s1[j] = '\0';
615                 } else {
616                         (void) do_case_conv(uv, u8s1, s1, sz1, is_it_toupper);
617                         s1 += sz1;
618                 }
619
620                 /* Do the same for the string s2. */
621                 sz2 = u8_number_of_bytes[*s2];
622                 if (sz2 < 0) {
623                         *errnum = EILSEQ;
624                         sz2 = 1;
625                 }
626
627                 if (sz2 == 1) {
628                         if (is_it_toupper)
629                                 u8s2[0] = U8_ASCII_TOUPPER(*s2);
630                         else
631                                 u8s2[0] = U8_ASCII_TOLOWER(*s2);
632                         s2++;
633                         u8s2[1] = '\0';
634                 } else if ((i2 + sz2) > n2) {
635                         *errnum = EINVAL;
636                         for (j = 0; (i2 + j) < n2; )
637                                 u8s2[j++] = *s2++;
638                         u8s2[j] = '\0';
639                 } else {
640                         (void) do_case_conv(uv, u8s2, s2, sz2, is_it_toupper);
641                         s2 += sz2;
642                 }
643
644                 /* Now compare the two characters. */
645                 if (sz1 == 1 && sz2 == 1) {
646                         if (*u8s1 > *u8s2)
647                                 return (1);
648                         if (*u8s1 < *u8s2)
649                                 return (-1);
650                 } else {
651                         f = strcmp((const char *)u8s1, (const char *)u8s2);
652                         if (f != 0)
653                                 return (f);
654                 }
655
656                 /*
657                  * They were the same. Let's move on to the next
658                  * characters then.
659                  */
660                 i1 += sz1;
661                 i2 += sz2;
662         }
663
664         /*
665          * We compared until the end of either or both strings.
666          *
667          * If we reached to or went over the ends for the both, that means
668          * they are the same.
669          *
670          * If we reached only one of the two ends, that means the other string
671          * has something which then the fact can be used to determine
672          * the return value.
673          */
674         if (i1 >= n1) {
675                 if (i2 >= n2)
676                         return (0);
677                 return (-1);
678         }
679         return (1);
680 }
681
682 /*
683  * The combining_class() function checks on the given bytes and find out
684  * the corresponding Unicode combining class value. The return value 0 means
685  * it is a Starter. Any illegal UTF-8 character will also be treated as
686  * a Starter.
687  */
688 static uchar_t
689 combining_class(size_t uv, uchar_t *s, size_t sz)
690 {
691         uint16_t b1 = 0;
692         uint16_t b2 = 0;
693         uint16_t b3 = 0;
694         uint16_t b4 = 0;
695
696         if (sz == 1 || sz > 4)
697                 return (0);
698
699         if (sz == 2) {
700                 b3 = s[0];
701                 b4 = s[1];
702         } else if (sz == 3) {
703                 b2 = s[0];
704                 b3 = s[1];
705                 b4 = s[2];
706         } else if (sz == 4) {
707                 b1 = s[0];
708                 b2 = s[1];
709                 b3 = s[2];
710                 b4 = s[3];
711         }
712
713         b1 = u8_common_b1_tbl[uv][b1];
714         if (b1 == U8_TBL_ELEMENT_NOT_DEF)
715                 return (0);
716
717         b2 = u8_combining_class_b2_tbl[uv][b1][b2];
718         if (b2 == U8_TBL_ELEMENT_NOT_DEF)
719                 return (0);
720
721         b3 = u8_combining_class_b3_tbl[uv][b2][b3];
722         if (b3 == U8_TBL_ELEMENT_NOT_DEF)
723                 return (0);
724
725         return (u8_combining_class_b4_tbl[uv][b3][b4]);
726 }
727
728 /*
729  * The do_decomp() function finds out a matching decomposition if any
730  * and return. If there is no match, the input bytes are copied and returned.
731  * The function also checks if there is a Hangul, decomposes it if necessary
732  * and returns.
733  *
734  * To save time, a single byte 7-bit ASCII character should be handled by
735  * the caller.
736  *
737  * The function returns the number of bytes returned sans always terminating
738  * the null byte. It will also return a state that will tell if there was
739  * a Hangul character decomposed which then will be used by the caller.
740  */
741 static size_t
742 do_decomp(size_t uv, uchar_t *u8s, uchar_t *s, int sz,
743     boolean_t canonical_decomposition, u8_normalization_states_t *state)
744 {
745         uint16_t b1 = 0;
746         uint16_t b2 = 0;
747         uint16_t b3 = 0;
748         uint16_t b3_tbl;
749         uint16_t b3_base;
750         uint16_t b4 = 0;
751         size_t start_id;
752         size_t end_id;
753         size_t i;
754         uint32_t u1;
755
756         if (sz == 2) {
757                 b3 = u8s[0] = s[0];
758                 b4 = u8s[1] = s[1];
759                 u8s[2] = '\0';
760         } else if (sz == 3) {
761                 /* Convert it to a Unicode scalar value. */
762                 U8_PUT_3BYTES_INTO_UTF32(u1, s[0], s[1], s[2]);
763
764                 /*
765                  * If this is a Hangul syllable, we decompose it into
766                  * a leading consonant, a vowel, and an optional trailing
767                  * consonant and then return.
768                  */
769                 if (U8_HANGUL_SYLLABLE(u1)) {
770                         u1 -= U8_HANGUL_SYL_FIRST;
771
772                         b1 = U8_HANGUL_JAMO_L_FIRST + u1 / U8_HANGUL_VT_COUNT;
773                         b2 = U8_HANGUL_JAMO_V_FIRST + (u1 % U8_HANGUL_VT_COUNT)
774                             / U8_HANGUL_T_COUNT;
775                         b3 = u1 % U8_HANGUL_T_COUNT;
776
777                         U8_SAVE_HANGUL_AS_UTF8(u8s, 0, 1, 2, b1);
778                         U8_SAVE_HANGUL_AS_UTF8(u8s, 3, 4, 5, b2);
779                         if (b3) {
780                                 b3 += U8_HANGUL_JAMO_T_FIRST;
781                                 U8_SAVE_HANGUL_AS_UTF8(u8s, 6, 7, 8, b3);
782
783                                 u8s[9] = '\0';
784                                 *state = U8_STATE_HANGUL_LVT;
785                                 return (9);
786                         }
787
788                         u8s[6] = '\0';
789                         *state = U8_STATE_HANGUL_LV;
790                         return (6);
791                 }
792
793                 b2 = u8s[0] = s[0];
794                 b3 = u8s[1] = s[1];
795                 b4 = u8s[2] = s[2];
796                 u8s[3] = '\0';
797
798                 /*
799                  * If this is a Hangul Jamo, we know there is nothing
800                  * further that we can decompose.
801                  */
802                 if (U8_HANGUL_JAMO_L(u1)) {
803                         *state = U8_STATE_HANGUL_L;
804                         return (3);
805                 }
806
807                 if (U8_HANGUL_JAMO_V(u1)) {
808                         if (*state == U8_STATE_HANGUL_L)
809                                 *state = U8_STATE_HANGUL_LV;
810                         else
811                                 *state = U8_STATE_HANGUL_V;
812                         return (3);
813                 }
814
815                 if (U8_HANGUL_JAMO_T(u1)) {
816                         if (*state == U8_STATE_HANGUL_LV)
817                                 *state = U8_STATE_HANGUL_LVT;
818                         else
819                                 *state = U8_STATE_HANGUL_T;
820                         return (3);
821                 }
822         } else if (sz == 4) {
823                 b1 = u8s[0] = s[0];
824                 b2 = u8s[1] = s[1];
825                 b3 = u8s[2] = s[2];
826                 b4 = u8s[3] = s[3];
827                 u8s[4] = '\0';
828         } else {
829                 /*
830                  * This is a fallback and should not happen if the function
831                  * was called properly.
832                  */
833                 u8s[0] = s[0];
834                 u8s[1] = '\0';
835                 *state = U8_STATE_START;
836                 return (1);
837         }
838
839         /*
840          * At this point, this routine does not know what it would get.
841          * The caller should sort it out if the state isn't a Hangul one.
842          */
843         *state = U8_STATE_START;
844
845         /* Try to find matching decomposition mapping byte sequence. */
846         b1 = u8_common_b1_tbl[uv][b1];
847         if (b1 == U8_TBL_ELEMENT_NOT_DEF)
848                 return ((size_t)sz);
849
850         b2 = u8_decomp_b2_tbl[uv][b1][b2];
851         if (b2 == U8_TBL_ELEMENT_NOT_DEF)
852                 return ((size_t)sz);
853
854         b3_tbl = u8_decomp_b3_tbl[uv][b2][b3].tbl_id;
855         if (b3_tbl == U8_TBL_ELEMENT_NOT_DEF)
856                 return ((size_t)sz);
857
858         /*
859          * If b3_tbl is bigger than or equal to U8_16BIT_TABLE_INDICATOR
860          * which is 0x8000, this means we couldn't fit the mappings into
861          * the cardinality of a unsigned byte.
862          */
863         if (b3_tbl >= U8_16BIT_TABLE_INDICATOR) {
864                 b3_tbl -= U8_16BIT_TABLE_INDICATOR;
865                 start_id = u8_decomp_b4_16bit_tbl[uv][b3_tbl][b4];
866                 end_id = u8_decomp_b4_16bit_tbl[uv][b3_tbl][b4 + 1];
867         } else {
868                 start_id = u8_decomp_b4_tbl[uv][b3_tbl][b4];
869                 end_id = u8_decomp_b4_tbl[uv][b3_tbl][b4 + 1];
870         }
871
872         /* This also means there wasn't any matching decomposition. */
873         if (start_id >= end_id)
874                 return ((size_t)sz);
875
876         /*
877          * The final table for decomposition mappings has three types of
878          * byte sequences depending on whether a mapping is for compatibility
879          * decomposition, canonical decomposition, or both like the following:
880          *
881          * (1) Compatibility decomposition mappings:
882          *
883          *      +---+---+-...-+---+
884          *      | B0| B1| ... | Bm|
885          *      +---+---+-...-+---+
886          *
887          *      The first byte, B0, is always less then 0xF5 (U8_DECOMP_BOTH).
888          *
889          * (2) Canonical decomposition mappings:
890          *
891          *      +---+---+---+-...-+---+
892          *      | T | b0| b1| ... | bn|
893          *      +---+---+---+-...-+---+
894          *
895          *      where the first byte, T, is 0xF6 (U8_DECOMP_CANONICAL).
896          *
897          * (3) Both mappings:
898          *
899          *      +---+---+---+---+-...-+---+---+---+-...-+---+
900          *      | T | D | b0| b1| ... | bn| B0| B1| ... | Bm|
901          *      +---+---+---+---+-...-+---+---+---+-...-+---+
902          *
903          *      where T is 0xF5 (U8_DECOMP_BOTH) and D is a displacement
904          *      byte, b0 to bn are canonical mapping bytes and B0 to Bm are
905          *      compatibility mapping bytes.
906          *
907          * Note that compatibility decomposition means doing recursive
908          * decompositions using both compatibility decomposition mappings and
909          * canonical decomposition mappings. On the other hand, canonical
910          * decomposition means doing recursive decompositions using only
911          * canonical decomposition mappings. Since the table we have has gone
912          * through the recursions already, we do not need to do so during
913          * runtime, i.e., the table has been completely flattened out
914          * already.
915          */
916
917         b3_base = u8_decomp_b3_tbl[uv][b2][b3].base;
918
919         /* Get the type, T, of the byte sequence. */
920         b1 = u8_decomp_final_tbl[uv][b3_base + start_id];
921
922         /*
923          * If necessary, adjust start_id, end_id, or both. Note that if
924          * this is compatibility decomposition mapping, there is no
925          * adjustment.
926          */
927         if (canonical_decomposition) {
928                 /* Is the mapping only for compatibility decomposition? */
929                 if (b1 < U8_DECOMP_BOTH)
930                         return ((size_t)sz);
931
932                 start_id++;
933
934                 if (b1 == U8_DECOMP_BOTH) {
935                         end_id = start_id +
936                             u8_decomp_final_tbl[uv][b3_base + start_id];
937                         start_id++;
938                 }
939         } else {
940                 /*
941                  * Unless this is a compatibility decomposition mapping,
942                  * we adjust the start_id.
943                  */
944                 if (b1 == U8_DECOMP_BOTH) {
945                         start_id++;
946                         start_id += u8_decomp_final_tbl[uv][b3_base + start_id];
947                 } else if (b1 == U8_DECOMP_CANONICAL) {
948                         start_id++;
949                 }
950         }
951
952         for (i = 0; start_id < end_id; start_id++)
953                 u8s[i++] = u8_decomp_final_tbl[uv][b3_base + start_id];
954         u8s[i] = '\0';
955
956         return (i);
957 }
958
959 /*
960  * The find_composition_start() function uses the character bytes given and
961  * find out the matching composition mappings if any and return the address
962  * to the composition mappings as explained in the do_composition().
963  */
964 static uchar_t *
965 find_composition_start(size_t uv, uchar_t *s, size_t sz)
966 {
967         uint16_t b1 = 0;
968         uint16_t b2 = 0;
969         uint16_t b3 = 0;
970         uint16_t b3_tbl;
971         uint16_t b3_base;
972         uint16_t b4 = 0;
973         size_t start_id;
974         size_t end_id;
975
976         if (sz == 1) {
977                 b4 = s[0];
978         } else if (sz == 2) {
979                 b3 = s[0];
980                 b4 = s[1];
981         } else if (sz == 3) {
982                 b2 = s[0];
983                 b3 = s[1];
984                 b4 = s[2];
985         } else if (sz == 4) {
986                 b1 = s[0];
987                 b2 = s[1];
988                 b3 = s[2];
989                 b4 = s[3];
990         } else {
991                 /*
992                  * This is a fallback and should not happen if the function
993                  * was called properly.
994                  */
995                 return (NULL);
996         }
997
998         b1 = u8_composition_b1_tbl[uv][b1];
999         if (b1 == U8_TBL_ELEMENT_NOT_DEF)
1000                 return (NULL);
1001
1002         b2 = u8_composition_b2_tbl[uv][b1][b2];
1003         if (b2 == U8_TBL_ELEMENT_NOT_DEF)
1004                 return (NULL);
1005
1006         b3_tbl = u8_composition_b3_tbl[uv][b2][b3].tbl_id;
1007         if (b3_tbl == U8_TBL_ELEMENT_NOT_DEF)
1008                 return (NULL);
1009
1010         if (b3_tbl >= U8_16BIT_TABLE_INDICATOR) {
1011                 b3_tbl -= U8_16BIT_TABLE_INDICATOR;
1012                 start_id = u8_composition_b4_16bit_tbl[uv][b3_tbl][b4];
1013                 end_id = u8_composition_b4_16bit_tbl[uv][b3_tbl][b4 + 1];
1014         } else {
1015                 start_id = u8_composition_b4_tbl[uv][b3_tbl][b4];
1016                 end_id = u8_composition_b4_tbl[uv][b3_tbl][b4 + 1];
1017         }
1018
1019         if (start_id >= end_id)
1020                 return (NULL);
1021
1022         b3_base = u8_composition_b3_tbl[uv][b2][b3].base;
1023
1024         return ((uchar_t *)&(u8_composition_final_tbl[uv][b3_base + start_id]));
1025 }
1026
1027 /*
1028  * The blocked() function checks on the combining class values of previous
1029  * characters in this sequence and return whether it is blocked or not.
1030  */
1031 static boolean_t
1032 blocked(uchar_t *comb_class, size_t last)
1033 {
1034         uchar_t my_comb_class;
1035         size_t i;
1036
1037         my_comb_class = comb_class[last];
1038         for (i = 1; i < last; i++)
1039                 if (comb_class[i] >= my_comb_class ||
1040                     comb_class[i] == U8_COMBINING_CLASS_STARTER)
1041                         return (B_TRUE);
1042
1043         return (B_FALSE);
1044 }
1045
1046 /*
1047  * The do_composition() reads the character string pointed by 's' and
1048  * do necessary canonical composition and then copy over the result back to
1049  * the 's'.
1050  *
1051  * The input argument 's' cannot contain more than 32 characters.
1052  */
1053 static size_t
1054 do_composition(size_t uv, uchar_t *s, uchar_t *comb_class, uchar_t *start,
1055     uchar_t *disp, size_t last, uchar_t **os, uchar_t *oslast)
1056 {
1057         uchar_t t[U8_STREAM_SAFE_TEXT_MAX + 1];
1058         uchar_t tc[U8_MB_CUR_MAX] = { '\0' };
1059         uint8_t saved_marks[U8_MAX_CHARS_A_SEQ];
1060         size_t saved_marks_count;
1061         uchar_t *p;
1062         uchar_t *saved_p;
1063         uchar_t *q;
1064         size_t i;
1065         size_t saved_i;
1066         size_t j;
1067         size_t k;
1068         size_t l;
1069         size_t C;
1070         size_t saved_l;
1071         size_t size;
1072         uint32_t u1;
1073         uint32_t u2;
1074         boolean_t match_not_found = B_TRUE;
1075
1076         /*
1077          * This should never happen unless the callers are doing some strange
1078          * and unexpected things.
1079          *
1080          * The "last" is the index pointing to the last character not last + 1.
1081          */
1082         if (last >= U8_MAX_CHARS_A_SEQ)
1083                 last = U8_UPPER_LIMIT_IN_A_SEQ;
1084
1085         for (i = l = 0; i <= last; i++) {
1086                 /*
1087                  * The last or any non-Starters at the beginning, we don't
1088                  * have any chance to do composition and so we just copy them
1089                  * to the temporary buffer.
1090                  */
1091                 if (i >= last || comb_class[i] != U8_COMBINING_CLASS_STARTER) {
1092 SAVE_THE_CHAR:
1093                         p = s + start[i];
1094                         size = disp[i];
1095                         for (k = 0; k < size; k++)
1096                                 t[l++] = *p++;
1097                         continue;
1098                 }
1099
1100                 /*
1101                  * If this could be a start of Hangul Jamos, then, we try to
1102                  * conjoin them.
1103                  */
1104                 if (s[start[i]] == U8_HANGUL_JAMO_1ST_BYTE) {
1105                         U8_PUT_3BYTES_INTO_UTF32(u1, s[start[i]],
1106                             s[start[i] + 1], s[start[i] + 2]);
1107                         U8_PUT_3BYTES_INTO_UTF32(u2, s[start[i] + 3],
1108                             s[start[i] + 4], s[start[i] + 5]);
1109
1110                         if (U8_HANGUL_JAMO_L(u1) && U8_HANGUL_JAMO_V(u2)) {
1111                                 u1 -= U8_HANGUL_JAMO_L_FIRST;
1112                                 u2 -= U8_HANGUL_JAMO_V_FIRST;
1113                                 u1 = U8_HANGUL_SYL_FIRST +
1114                                     (u1 * U8_HANGUL_V_COUNT + u2) *
1115                                     U8_HANGUL_T_COUNT;
1116
1117                                 i += 2;
1118                                 if (i <= last) {
1119                                         U8_PUT_3BYTES_INTO_UTF32(u2,
1120                                             s[start[i]], s[start[i] + 1],
1121                                             s[start[i] + 2]);
1122
1123                                         if (U8_HANGUL_JAMO_T(u2)) {
1124                                                 u1 += u2 -
1125                                                     U8_HANGUL_JAMO_T_FIRST;
1126                                                 i++;
1127                                         }
1128                                 }
1129
1130                                 U8_SAVE_HANGUL_AS_UTF8(t + l, 0, 1, 2, u1);
1131                                 i--;
1132                                 l += 3;
1133                                 continue;
1134                         }
1135                 }
1136
1137                 /*
1138                  * Let's then find out if this Starter has composition
1139                  * mapping.
1140                  */
1141                 p = find_composition_start(uv, s + start[i], disp[i]);
1142                 if (p == NULL)
1143                         goto SAVE_THE_CHAR;
1144
1145                 /*
1146                  * We have a Starter with composition mapping and the next
1147                  * character is a non-Starter. Let's try to find out if
1148                  * we can do composition.
1149                  */
1150
1151                 saved_p = p;
1152                 saved_i = i;
1153                 saved_l = l;
1154                 saved_marks_count = 0;
1155
1156 TRY_THE_NEXT_MARK:
1157                 q = s + start[++i];
1158                 size = disp[i];
1159
1160                 /*
1161                  * The next for() loop compares the non-Starter pointed by
1162                  * 'q' with the possible (joinable) characters pointed by 'p'.
1163                  *
1164                  * The composition final table entry pointed by the 'p'
1165                  * looks like the following:
1166                  *
1167                  * +---+---+---+-...-+---+---+---+---+-...-+---+---+
1168                  * | C | b0| b2| ... | bn| F | B0| B1| ... | Bm| F |
1169                  * +---+---+---+-...-+---+---+---+---+-...-+---+---+
1170                  *
1171                  * where C is the count byte indicating the number of
1172                  * mapping pairs where each pair would be look like
1173                  * (b0-bn F, B0-Bm F). The b0-bn are the bytes of the second
1174                  * character of a canonical decomposition and the B0-Bm are
1175                  * the bytes of a matching composite character. The F is
1176                  * a filler byte after each character as the separator.
1177                  */
1178
1179                 match_not_found = B_TRUE;
1180
1181                 for (C = *p++; C > 0; C--) {
1182                         for (k = 0; k < size; p++, k++)
1183                                 if (*p != q[k])
1184                                         break;
1185
1186                         /* Have we found it? */
1187                         if (k >= size && *p == U8_TBL_ELEMENT_FILLER) {
1188                                 match_not_found = B_FALSE;
1189
1190                                 l = saved_l;
1191
1192                                 while (*++p != U8_TBL_ELEMENT_FILLER)
1193                                         t[l++] = *p;
1194
1195                                 break;
1196                         }
1197
1198                         /* We didn't find; skip to the next pair. */
1199                         if (*p != U8_TBL_ELEMENT_FILLER)
1200                                 while (*++p != U8_TBL_ELEMENT_FILLER)
1201                                         ;
1202                         while (*++p != U8_TBL_ELEMENT_FILLER)
1203                                 ;
1204                         p++;
1205                 }
1206
1207                 /*
1208                  * If there was no match, we will need to save the combining
1209                  * mark for later appending. After that, if the next one
1210                  * is a non-Starter and not blocked, then, we try once
1211                  * again to do composition with the next non-Starter.
1212                  *
1213                  * If there was no match and this was a Starter, then,
1214                  * this is a new start.
1215                  *
1216                  * If there was a match and a composition done and we have
1217                  * more to check on, then, we retrieve a new composition final
1218                  * table entry for the composite and then try to do the
1219                  * composition again.
1220                  */
1221
1222                 if (match_not_found) {
1223                         if (comb_class[i] == U8_COMBINING_CLASS_STARTER) {
1224                                 i--;
1225                                 goto SAVE_THE_CHAR;
1226                         }
1227
1228                         saved_marks[saved_marks_count++] = i;
1229                 }
1230
1231                 if (saved_l == l) {
1232                         while (i < last) {
1233                                 if (blocked(comb_class, i + 1))
1234                                         saved_marks[saved_marks_count++] = ++i;
1235                                 else
1236                                         break;
1237                         }
1238                         if (i < last) {
1239                                 p = saved_p;
1240                                 goto TRY_THE_NEXT_MARK;
1241                         }
1242                 } else if (i < last) {
1243                         p = find_composition_start(uv, t + saved_l,
1244                             l - saved_l);
1245                         if (p != NULL) {
1246                                 saved_p = p;
1247                                 goto TRY_THE_NEXT_MARK;
1248                         }
1249                 }
1250
1251                 /*
1252                  * There is no more composition possible.
1253                  *
1254                  * If there was no composition what so ever then we copy
1255                  * over the original Starter and then append any non-Starters
1256                  * remaining at the target string sequentially after that.
1257                  */
1258
1259                 if (saved_l == l) {
1260                         p = s + start[saved_i];
1261                         size = disp[saved_i];
1262                         for (j = 0; j < size; j++)
1263                                 t[l++] = *p++;
1264                 }
1265
1266                 for (k = 0; k < saved_marks_count; k++) {
1267                         p = s + start[saved_marks[k]];
1268                         size = disp[saved_marks[k]];
1269                         for (j = 0; j < size; j++)
1270                                 t[l++] = *p++;
1271                 }
1272         }
1273
1274         /*
1275          * If the last character is a Starter and if we have a character
1276          * (possibly another Starter) that can be turned into a composite,
1277          * we do so and we do so until there is no more of composition
1278          * possible.
1279          */
1280         if (comb_class[last] == U8_COMBINING_CLASS_STARTER) {
1281                 p = *os;
1282                 saved_l = l - disp[last];
1283
1284                 while (p < oslast) {
1285                         size = u8_number_of_bytes[*p];
1286                         if (size <= 1 || (p + size) > oslast)
1287                                 break;
1288
1289                         saved_p = p;
1290
1291                         for (i = 0; i < size; i++)
1292                                 tc[i] = *p++;
1293
1294                         q = find_composition_start(uv, t + saved_l,
1295                             l - saved_l);
1296                         if (q == NULL) {
1297                                 p = saved_p;
1298                                 break;
1299                         }
1300
1301                         match_not_found = B_TRUE;
1302
1303                         for (C = *q++; C > 0; C--) {
1304                                 for (k = 0; k < size; q++, k++)
1305                                         if (*q != tc[k])
1306                                                 break;
1307
1308                                 if (k >= size && *q == U8_TBL_ELEMENT_FILLER) {
1309                                         match_not_found = B_FALSE;
1310
1311                                         l = saved_l;
1312
1313                                         while (*++q != U8_TBL_ELEMENT_FILLER) {
1314                                                 /*
1315                                                  * This is practically
1316                                                  * impossible but we don't
1317                                                  * want to take any chances.
1318                                                  */
1319                                                 if (l >=
1320                                                     U8_STREAM_SAFE_TEXT_MAX) {
1321                                                         p = saved_p;
1322                                                         goto SAFE_RETURN;
1323                                                 }
1324                                                 t[l++] = *q;
1325                                         }
1326
1327                                         break;
1328                                 }
1329
1330                                 if (*q != U8_TBL_ELEMENT_FILLER)
1331                                         while (*++q != U8_TBL_ELEMENT_FILLER)
1332                                                 ;
1333                                 while (*++q != U8_TBL_ELEMENT_FILLER)
1334                                         ;
1335                                 q++;
1336                         }
1337
1338                         if (match_not_found) {
1339                                 p = saved_p;
1340                                 break;
1341                         }
1342                 }
1343 SAFE_RETURN:
1344                 *os = p;
1345         }
1346
1347         /*
1348          * Now we copy over the temporary string to the target string.
1349          * Since composition always reduces the number of characters or
1350          * the number of characters stay, we don't need to worry about
1351          * the buffer overflow here.
1352          */
1353         for (i = 0; i < l; i++)
1354                 s[i] = t[i];
1355         s[l] = '\0';
1356
1357         return (l);
1358 }
1359
1360 /*
1361  * The collect_a_seq() function checks on the given string s, collect
1362  * a sequence of characters at u8s, and return the sequence. While it collects
1363  * a sequence, it also applies case conversion, canonical or compatibility
1364  * decomposition, canonical decomposition, or some or all of them and
1365  * in that order.
1366  *
1367  * The collected sequence cannot be bigger than 32 characters since if
1368  * it is having more than 31 characters, the sequence will be terminated
1369  * with a U+034F COMBINING GRAPHEME JOINER (CGJ) character and turned into
1370  * a Stream-Safe Text. The collected sequence is always terminated with
1371  * a null byte and the return value is the byte length of the sequence
1372  * including 0. The return value does not include the terminating
1373  * null byte.
1374  */
1375 static size_t
1376 collect_a_seq(size_t uv, uchar_t *u8s, uchar_t **source, uchar_t *slast,
1377     boolean_t is_it_toupper, boolean_t is_it_tolower,
1378     boolean_t canonical_decomposition, boolean_t compatibility_decomposition,
1379     boolean_t canonical_composition,
1380     int *errnum, u8_normalization_states_t *state)
1381 {
1382         uchar_t *s;
1383         int sz;
1384         int saved_sz;
1385         size_t i;
1386         size_t j;
1387         size_t k;
1388         size_t l;
1389         uchar_t comb_class[U8_MAX_CHARS_A_SEQ];
1390         uchar_t disp[U8_MAX_CHARS_A_SEQ];
1391         uchar_t start[U8_MAX_CHARS_A_SEQ];
1392         uchar_t u8t[U8_MB_CUR_MAX] = { '\0' };
1393         uchar_t uts[U8_STREAM_SAFE_TEXT_MAX + 1];
1394         uchar_t tc;
1395         size_t last;
1396         size_t saved_last;
1397         uint32_t u1;
1398
1399         /*
1400          * Save the source string pointer which we will return a changed
1401          * pointer if we do processing.
1402          */
1403         s = *source;
1404
1405         /*
1406          * The following is a fallback for just in case callers are not
1407          * checking the string boundaries before the calling.
1408          */
1409         if (s >= slast) {
1410                 u8s[0] = '\0';
1411
1412                 return (0);
1413         }
1414
1415         /*
1416          * As the first thing, let's collect a character and do case
1417          * conversion if necessary.
1418          */
1419
1420         sz = u8_number_of_bytes[*s];
1421
1422         if (sz < 0) {
1423                 *errnum = EILSEQ;
1424
1425                 u8s[0] = *s++;
1426                 u8s[1] = '\0';
1427
1428                 *source = s;
1429
1430                 return (1);
1431         }
1432
1433         if (sz == 1) {
1434                 if (is_it_toupper)
1435                         u8s[0] = U8_ASCII_TOUPPER(*s);
1436                 else if (is_it_tolower)
1437                         u8s[0] = U8_ASCII_TOLOWER(*s);
1438                 else
1439                         u8s[0] = *s;
1440                 s++;
1441                 u8s[1] = '\0';
1442         } else if ((s + sz) > slast) {
1443                 *errnum = EINVAL;
1444
1445                 for (i = 0; s < slast; )
1446                         u8s[i++] = *s++;
1447                 u8s[i] = '\0';
1448
1449                 *source = s;
1450
1451                 return (i);
1452         } else {
1453                 if (is_it_toupper || is_it_tolower) {
1454                         i = do_case_conv(uv, u8s, s, sz, is_it_toupper);
1455                         s += sz;
1456                         sz = i;
1457                 } else {
1458                         for (i = 0; i < sz; )
1459                                 u8s[i++] = *s++;
1460                         u8s[i] = '\0';
1461                 }
1462         }
1463
1464         /*
1465          * And then canonical/compatibility decomposition followed by
1466          * an optional canonical composition. Please be noted that
1467          * canonical composition is done only when a decomposition is
1468          * done.
1469          */
1470         if (canonical_decomposition || compatibility_decomposition) {
1471                 if (sz == 1) {
1472                         *state = U8_STATE_START;
1473
1474                         saved_sz = 1;
1475
1476                         comb_class[0] = 0;
1477                         start[0] = 0;
1478                         disp[0] = 1;
1479
1480                         last = 1;
1481                 } else {
1482                         saved_sz = do_decomp(uv, u8s, u8s, sz,
1483                             canonical_decomposition, state);
1484
1485                         last = 0;
1486
1487                         for (i = 0; i < saved_sz; ) {
1488                                 sz = u8_number_of_bytes[u8s[i]];
1489
1490                                 comb_class[last] = combining_class(uv,
1491                                     u8s + i, sz);
1492                                 start[last] = i;
1493                                 disp[last] = sz;
1494
1495                                 last++;
1496                                 i += sz;
1497                         }
1498
1499                         /*
1500                          * Decomposition yields various Hangul related
1501                          * states but not on combining marks. We need to
1502                          * find out at here by checking on the last
1503                          * character.
1504                          */
1505                         if (*state == U8_STATE_START) {
1506                                 if (comb_class[last - 1])
1507                                         *state = U8_STATE_COMBINING_MARK;
1508                         }
1509                 }
1510
1511                 saved_last = last;
1512
1513                 while (s < slast) {
1514                         sz = u8_number_of_bytes[*s];
1515
1516                         /*
1517                          * If this is an illegal character, an incomplete
1518                          * character, or an 7-bit ASCII Starter character,
1519                          * then we have collected a sequence; break and let
1520                          * the next call deal with the two cases.
1521                          *
1522                          * Note that this is okay only if you are using this
1523                          * function with a fixed length string, not on
1524                          * a buffer with multiple calls of one chunk at a time.
1525                          */
1526                         if (sz <= 1) {
1527                                 break;
1528                         } else if ((s + sz) > slast) {
1529                                 break;
1530                         } else {
1531                                 /*
1532                                  * If the previous character was a Hangul Jamo
1533                                  * and this character is a Hangul Jamo that
1534                                  * can be conjoined, we collect the Jamo.
1535                                  */
1536                                 if (*s == U8_HANGUL_JAMO_1ST_BYTE) {
1537                                         U8_PUT_3BYTES_INTO_UTF32(u1,
1538                                             *s, *(s + 1), *(s + 2));
1539
1540                                         if (U8_HANGUL_COMPOSABLE_L_V(*state,
1541                                             u1)) {
1542                                                 i = 0;
1543                                                 *state = U8_STATE_HANGUL_LV;
1544                                                 goto COLLECT_A_HANGUL;
1545                                         }
1546
1547                                         if (U8_HANGUL_COMPOSABLE_LV_T(*state,
1548                                             u1)) {
1549                                                 i = 0;
1550                                                 *state = U8_STATE_HANGUL_LVT;
1551                                                 goto COLLECT_A_HANGUL;
1552                                         }
1553                                 }
1554
1555                                 /*
1556                                  * Regardless of whatever it was, if this is
1557                                  * a Starter, we don't collect the character
1558                                  * since that's a new start and we will deal
1559                                  * with it at the next time.
1560                                  */
1561                                 i = combining_class(uv, s, sz);
1562                                 if (i == U8_COMBINING_CLASS_STARTER)
1563                                         break;
1564
1565                                 /*
1566                                  * We know the current character is a combining
1567                                  * mark. If the previous character wasn't
1568                                  * a Starter (not Hangul) or a combining mark,
1569                                  * then, we don't collect this combining mark.
1570                                  */
1571                                 if (*state != U8_STATE_START &&
1572                                     *state != U8_STATE_COMBINING_MARK)
1573                                         break;
1574
1575                                 *state = U8_STATE_COMBINING_MARK;
1576 COLLECT_A_HANGUL:
1577                                 /*
1578                                  * If we collected a Starter and combining
1579                                  * marks up to 30, i.e., total 31 characters,
1580                                  * then, we terminate this degenerately long
1581                                  * combining sequence with a U+034F COMBINING
1582                                  * GRAPHEME JOINER (CGJ) which is 0xCD 0x8F in
1583                                  * UTF-8 and turn this into a Stream-Safe
1584                                  * Text. This will be extremely rare but
1585                                  * possible.
1586                                  *
1587                                  * The following will also guarantee that
1588                                  * we are not writing more than 32 characters
1589                                  * plus a NULL at u8s[].
1590                                  */
1591                                 if (last >= U8_UPPER_LIMIT_IN_A_SEQ) {
1592 TURN_STREAM_SAFE:
1593                                         *state = U8_STATE_START;
1594                                         comb_class[last] = 0;
1595                                         start[last] = saved_sz;
1596                                         disp[last] = 2;
1597                                         last++;
1598
1599                                         u8s[saved_sz++] = 0xCD;
1600                                         u8s[saved_sz++] = 0x8F;
1601
1602                                         break;
1603                                 }
1604
1605                                 /*
1606                                  * Some combining marks also do decompose into
1607                                  * another combining mark or marks.
1608                                  */
1609                                 if (*state == U8_STATE_COMBINING_MARK) {
1610                                         k = last;
1611                                         l = sz;
1612                                         i = do_decomp(uv, uts, s, sz,
1613                                             canonical_decomposition, state);
1614                                         for (j = 0; j < i; ) {
1615                                                 sz = u8_number_of_bytes[uts[j]];
1616
1617                                                 comb_class[last] =
1618                                                     combining_class(uv,
1619                                                     uts + j, sz);
1620                                                 start[last] = saved_sz + j;
1621                                                 disp[last] = sz;
1622
1623                                                 last++;
1624                                                 if (last >=
1625                                                     U8_UPPER_LIMIT_IN_A_SEQ) {
1626                                                         last = k;
1627                                                         goto TURN_STREAM_SAFE;
1628                                                 }
1629                                                 j += sz;
1630                                         }
1631
1632                                         *state = U8_STATE_COMBINING_MARK;
1633                                         sz = i;
1634                                         s += l;
1635
1636                                         for (i = 0; i < sz; i++)
1637                                                 u8s[saved_sz++] = uts[i];
1638                                 } else {
1639                                         comb_class[last] = i;
1640                                         start[last] = saved_sz;
1641                                         disp[last] = sz;
1642                                         last++;
1643
1644                                         for (i = 0; i < sz; i++)
1645                                                 u8s[saved_sz++] = *s++;
1646                                 }
1647
1648                                 /*
1649                                  * If this is U+0345 COMBINING GREEK
1650                                  * YPOGEGRAMMENI (0xCD 0x85 in UTF-8), a.k.a.,
1651                                  * iota subscript, and need to be converted to
1652                                  * uppercase letter, convert it to U+0399 GREEK
1653                                  * CAPITAL LETTER IOTA (0xCE 0x99 in UTF-8),
1654                                  * i.e., convert to capital adscript form as
1655                                  * specified in the Unicode standard.
1656                                  *
1657                                  * This is the only special case of (ambiguous)
1658                                  * case conversion at combining marks and
1659                                  * probably the standard will never have
1660                                  * anything similar like this in future.
1661                                  */
1662                                 if (is_it_toupper && sz >= 2 &&
1663                                     u8s[saved_sz - 2] == 0xCD &&
1664                                     u8s[saved_sz - 1] == 0x85) {
1665                                         u8s[saved_sz - 2] = 0xCE;
1666                                         u8s[saved_sz - 1] = 0x99;
1667                                 }
1668                         }
1669                 }
1670
1671                 /*
1672                  * Let's try to ensure a canonical ordering for the collected
1673                  * combining marks. We do this only if we have collected
1674                  * at least one more non-Starter. (The decomposition mapping
1675                  * data tables have fully (and recursively) expanded and
1676                  * canonically ordered decompositions.)
1677                  *
1678                  * The U8_SWAP_COMB_MARKS() convenience macro has some
1679                  * assumptions and we are meeting the assumptions.
1680                  */
1681                 last--;
1682                 if (last >= saved_last) {
1683                         for (i = 0; i < last; i++)
1684                                 for (j = last; j > i; j--)
1685                                         if (comb_class[j] &&
1686                                             comb_class[j - 1] > comb_class[j]) {
1687                                                 U8_SWAP_COMB_MARKS(j - 1, j);
1688                                         }
1689                 }
1690
1691                 *source = s;
1692
1693                 if (! canonical_composition) {
1694                         u8s[saved_sz] = '\0';
1695                         return (saved_sz);
1696                 }
1697
1698                 /*
1699                  * Now do the canonical composition. Note that we do this
1700                  * only after a canonical or compatibility decomposition to
1701                  * finish up NFC or NFKC.
1702                  */
1703                 sz = do_composition(uv, u8s, comb_class, start, disp, last,
1704                     &s, slast);
1705         }
1706
1707         *source = s;
1708
1709         return ((size_t)sz);
1710 }
1711
1712 /*
1713  * The do_norm_compare() function does string comparison based on Unicode
1714  * simple case mappings and Unicode Normalization definitions.
1715  *
1716  * It does so by collecting a sequence of character at a time and comparing
1717  * the collected sequences from the strings.
1718  *
1719  * The meanings on the return values are the same as the usual strcmp().
1720  */
1721 static int
1722 do_norm_compare(size_t uv, uchar_t *s1, uchar_t *s2, size_t n1, size_t n2,
1723     int flag, int *errnum)
1724 {
1725         int result;
1726         size_t sz1;
1727         size_t sz2;
1728         uchar_t u8s1[U8_STREAM_SAFE_TEXT_MAX + 1];
1729         uchar_t u8s2[U8_STREAM_SAFE_TEXT_MAX + 1];
1730         uchar_t *s1last;
1731         uchar_t *s2last;
1732         boolean_t is_it_toupper;
1733         boolean_t is_it_tolower;
1734         boolean_t canonical_decomposition;
1735         boolean_t compatibility_decomposition;
1736         boolean_t canonical_composition;
1737         u8_normalization_states_t state;
1738
1739         s1last = s1 + n1;
1740         s2last = s2 + n2;
1741
1742         is_it_toupper = flag & U8_TEXTPREP_TOUPPER;
1743         is_it_tolower = flag & U8_TEXTPREP_TOLOWER;
1744         canonical_decomposition = flag & U8_CANON_DECOMP;
1745         compatibility_decomposition = flag & U8_COMPAT_DECOMP;
1746         canonical_composition = flag & U8_CANON_COMP;
1747
1748         while (s1 < s1last && s2 < s2last) {
1749                 /*
1750                  * If the current character is a 7-bit ASCII and the last
1751                  * character, or, if the current character and the next
1752                  * character are both some 7-bit ASCII characters then
1753                  * we treat the current character as a sequence.
1754                  *
1755                  * In any other cases, we need to call collect_a_seq().
1756                  */
1757
1758                 if (U8_ISASCII(*s1) && ((s1 + 1) >= s1last ||
1759                     ((s1 + 1) < s1last && U8_ISASCII(*(s1 + 1))))) {
1760                         if (is_it_toupper)
1761                                 u8s1[0] = U8_ASCII_TOUPPER(*s1);
1762                         else if (is_it_tolower)
1763                                 u8s1[0] = U8_ASCII_TOLOWER(*s1);
1764                         else
1765                                 u8s1[0] = *s1;
1766                         u8s1[1] = '\0';
1767                         sz1 = 1;
1768                         s1++;
1769                 } else {
1770                         state = U8_STATE_START;
1771                         sz1 = collect_a_seq(uv, u8s1, &s1, s1last,
1772                             is_it_toupper, is_it_tolower,
1773                             canonical_decomposition,
1774                             compatibility_decomposition,
1775                             canonical_composition, errnum, &state);
1776                 }
1777
1778                 if (U8_ISASCII(*s2) && ((s2 + 1) >= s2last ||
1779                     ((s2 + 1) < s2last && U8_ISASCII(*(s2 + 1))))) {
1780                         if (is_it_toupper)
1781                                 u8s2[0] = U8_ASCII_TOUPPER(*s2);
1782                         else if (is_it_tolower)
1783                                 u8s2[0] = U8_ASCII_TOLOWER(*s2);
1784                         else
1785                                 u8s2[0] = *s2;
1786                         u8s2[1] = '\0';
1787                         sz2 = 1;
1788                         s2++;
1789                 } else {
1790                         state = U8_STATE_START;
1791                         sz2 = collect_a_seq(uv, u8s2, &s2, s2last,
1792                             is_it_toupper, is_it_tolower,
1793                             canonical_decomposition,
1794                             compatibility_decomposition,
1795                             canonical_composition, errnum, &state);
1796                 }
1797
1798                 /*
1799                  * Now compare the two characters. If they are the same,
1800                  * we move on to the next character sequences.
1801                  */
1802                 if (sz1 == 1 && sz2 == 1) {
1803                         if (*u8s1 > *u8s2)
1804                                 return (1);
1805                         if (*u8s1 < *u8s2)
1806                                 return (-1);
1807                 } else {
1808                         result = strcmp((const char *)u8s1, (const char *)u8s2);
1809                         if (result != 0)
1810                                 return (result);
1811                 }
1812         }
1813
1814         /*
1815          * We compared until the end of either or both strings.
1816          *
1817          * If we reached to or went over the ends for the both, that means
1818          * they are the same.
1819          *
1820          * If we reached only one end, that means the other string has
1821          * something which then can be used to determine the return value.
1822          */
1823         if (s1 >= s1last) {
1824                 if (s2 >= s2last)
1825                         return (0);
1826                 return (-1);
1827         }
1828         return (1);
1829 }
1830
1831 /*
1832  * The u8_strcmp() function compares two UTF-8 strings quite similar to
1833  * the strcmp(). For the comparison, however, Unicode Normalization specific
1834  * equivalency and Unicode simple case conversion mappings based equivalency
1835  * can be requested and checked against.
1836  */
1837 int
1838 u8_strcmp(const char *s1, const char *s2, size_t n, int flag, size_t uv,
1839     int *errnum)
1840 {
1841         int f;
1842         size_t n1;
1843         size_t n2;
1844
1845         *errnum = 0;
1846
1847         /*
1848          * Check on the requested Unicode version, case conversion, and
1849          * normalization flag values.
1850          */
1851
1852         if (uv > U8_UNICODE_LATEST) {
1853                 *errnum = ERANGE;
1854                 uv = U8_UNICODE_LATEST;
1855         }
1856
1857         if (flag == 0) {
1858                 flag = U8_STRCMP_CS;
1859         } else {
1860                 f = flag & (U8_STRCMP_CS | U8_STRCMP_CI_UPPER |
1861                     U8_STRCMP_CI_LOWER);
1862                 if (f == 0) {
1863                         flag |= U8_STRCMP_CS;
1864                 } else if (f != U8_STRCMP_CS && f != U8_STRCMP_CI_UPPER &&
1865                     f != U8_STRCMP_CI_LOWER) {
1866                         *errnum = EBADF;
1867                         flag = U8_STRCMP_CS;
1868                 }
1869
1870                 f = flag & (U8_CANON_DECOMP | U8_COMPAT_DECOMP | U8_CANON_COMP);
1871                 if (f && f != U8_STRCMP_NFD && f != U8_STRCMP_NFC &&
1872                     f != U8_STRCMP_NFKD && f != U8_STRCMP_NFKC) {
1873                         *errnum = EBADF;
1874                         flag = U8_STRCMP_CS;
1875                 }
1876         }
1877
1878         if (flag == U8_STRCMP_CS) {
1879                 return (n == 0 ? strcmp(s1, s2) : strncmp(s1, s2, n));
1880         }
1881
1882         n1 = strlen(s1);
1883         n2 = strlen(s2);
1884         if (n != 0) {
1885                 if (n < n1)
1886                         n1 = n;
1887                 if (n < n2)
1888                         n2 = n;
1889         }
1890
1891         /*
1892          * Simple case conversion can be done much faster and so we do
1893          * them separately here.
1894          */
1895         if (flag == U8_STRCMP_CI_UPPER) {
1896                 return (do_case_compare(uv, (uchar_t *)s1, (uchar_t *)s2,
1897                     n1, n2, B_TRUE, errnum));
1898         } else if (flag == U8_STRCMP_CI_LOWER) {
1899                 return (do_case_compare(uv, (uchar_t *)s1, (uchar_t *)s2,
1900                     n1, n2, B_FALSE, errnum));
1901         }
1902
1903         return (do_norm_compare(uv, (uchar_t *)s1, (uchar_t *)s2, n1, n2,
1904             flag, errnum));
1905 }
1906
1907 size_t
1908 u8_textprep_str(char *inarray, size_t *inlen, char *outarray, size_t *outlen,
1909     int flag, size_t unicode_version, int *errnum)
1910 {
1911         int f;
1912         int sz;
1913         uchar_t *ib;
1914         uchar_t *ibtail;
1915         uchar_t *ob;
1916         uchar_t *obtail;
1917         boolean_t do_not_ignore_null;
1918         boolean_t do_not_ignore_invalid;
1919         boolean_t is_it_toupper;
1920         boolean_t is_it_tolower;
1921         boolean_t canonical_decomposition;
1922         boolean_t compatibility_decomposition;
1923         boolean_t canonical_composition;
1924         size_t ret_val;
1925         size_t i;
1926         size_t j;
1927         uchar_t u8s[U8_STREAM_SAFE_TEXT_MAX + 1];
1928         u8_normalization_states_t state;
1929
1930         if (unicode_version > U8_UNICODE_LATEST) {
1931                 *errnum = ERANGE;
1932                 return ((size_t)-1);
1933         }
1934
1935         f = flag & (U8_TEXTPREP_TOUPPER | U8_TEXTPREP_TOLOWER);
1936         if (f == (U8_TEXTPREP_TOUPPER | U8_TEXTPREP_TOLOWER)) {
1937                 *errnum = EBADF;
1938                 return ((size_t)-1);
1939         }
1940
1941         f = flag & (U8_CANON_DECOMP | U8_COMPAT_DECOMP | U8_CANON_COMP);
1942         if (f && f != U8_TEXTPREP_NFD && f != U8_TEXTPREP_NFC &&
1943             f != U8_TEXTPREP_NFKD && f != U8_TEXTPREP_NFKC) {
1944                 *errnum = EBADF;
1945                 return ((size_t)-1);
1946         }
1947
1948         if (inarray == NULL || *inlen == 0)
1949                 return (0);
1950
1951         if (outarray == NULL) {
1952                 *errnum = E2BIG;
1953                 return ((size_t)-1);
1954         }
1955
1956         ib = (uchar_t *)inarray;
1957         ob = (uchar_t *)outarray;
1958         ibtail = ib + *inlen;
1959         obtail = ob + *outlen;
1960
1961         do_not_ignore_null = !(flag & U8_TEXTPREP_IGNORE_NULL);
1962         do_not_ignore_invalid = !(flag & U8_TEXTPREP_IGNORE_INVALID);
1963         is_it_toupper = flag & U8_TEXTPREP_TOUPPER;
1964         is_it_tolower = flag & U8_TEXTPREP_TOLOWER;
1965
1966         ret_val = 0;
1967
1968         /*
1969          * If we don't have a normalization flag set, we do the simple case
1970          * conversion based text preparation separately below. Text
1971          * preparation involving Normalization will be done in the false task
1972          * block, again, separately since it will take much more time and
1973          * resource than doing simple case conversions.
1974          */
1975         if (f == 0) {
1976                 while (ib < ibtail) {
1977                         if (*ib == '\0' && do_not_ignore_null)
1978                                 break;
1979
1980                         sz = u8_number_of_bytes[*ib];
1981
1982                         if (sz < 0) {
1983                                 if (do_not_ignore_invalid) {
1984                                         *errnum = EILSEQ;
1985                                         ret_val = (size_t)-1;
1986                                         break;
1987                                 }
1988
1989                                 sz = 1;
1990                                 ret_val++;
1991                         }
1992
1993                         if (sz == 1) {
1994                                 if (ob >= obtail) {
1995                                         *errnum = E2BIG;
1996                                         ret_val = (size_t)-1;
1997                                         break;
1998                                 }
1999
2000                                 if (is_it_toupper)
2001                                         *ob = U8_ASCII_TOUPPER(*ib);
2002                                 else if (is_it_tolower)
2003                                         *ob = U8_ASCII_TOLOWER(*ib);
2004                                 else
2005                                         *ob = *ib;
2006                                 ib++;
2007                                 ob++;
2008                         } else if ((ib + sz) > ibtail) {
2009                                 if (do_not_ignore_invalid) {
2010                                         *errnum = EINVAL;
2011                                         ret_val = (size_t)-1;
2012                                         break;
2013                                 }
2014
2015                                 if ((obtail - ob) < (ibtail - ib)) {
2016                                         *errnum = E2BIG;
2017                                         ret_val = (size_t)-1;
2018                                         break;
2019                                 }
2020
2021                                 /*
2022                                  * We treat the remaining incomplete character
2023                                  * bytes as a character.
2024                                  */
2025                                 ret_val++;
2026
2027                                 while (ib < ibtail)
2028                                         *ob++ = *ib++;
2029                         } else {
2030                                 if (is_it_toupper || is_it_tolower) {
2031                                         i = do_case_conv(unicode_version, u8s,
2032                                             ib, sz, is_it_toupper);
2033
2034                                         if ((obtail - ob) < i) {
2035                                                 *errnum = E2BIG;
2036                                                 ret_val = (size_t)-1;
2037                                                 break;
2038                                         }
2039
2040                                         ib += sz;
2041
2042                                         for (sz = 0; sz < i; sz++)
2043                                                 *ob++ = u8s[sz];
2044                                 } else {
2045                                         if ((obtail - ob) < sz) {
2046                                                 *errnum = E2BIG;
2047                                                 ret_val = (size_t)-1;
2048                                                 break;
2049                                         }
2050
2051                                         for (i = 0; i < sz; i++)
2052                                                 *ob++ = *ib++;
2053                                 }
2054                         }
2055                 }
2056         } else {
2057                 canonical_decomposition = flag & U8_CANON_DECOMP;
2058                 compatibility_decomposition = flag & U8_COMPAT_DECOMP;
2059                 canonical_composition = flag & U8_CANON_COMP;
2060
2061                 while (ib < ibtail) {
2062                         if (*ib == '\0' && do_not_ignore_null)
2063                                 break;
2064
2065                         /*
2066                          * If the current character is a 7-bit ASCII
2067                          * character and it is the last character, or,
2068                          * if the current character is a 7-bit ASCII
2069                          * character and the next character is also a 7-bit
2070                          * ASCII character, then, we copy over this
2071                          * character without going through collect_a_seq().
2072                          *
2073                          * In any other cases, we need to look further with
2074                          * the collect_a_seq() function.
2075                          */
2076                         if (U8_ISASCII(*ib) && ((ib + 1) >= ibtail ||
2077                             ((ib + 1) < ibtail && U8_ISASCII(*(ib + 1))))) {
2078                                 if (ob >= obtail) {
2079                                         *errnum = E2BIG;
2080                                         ret_val = (size_t)-1;
2081                                         break;
2082                                 }
2083
2084                                 if (is_it_toupper)
2085                                         *ob = U8_ASCII_TOUPPER(*ib);
2086                                 else if (is_it_tolower)
2087                                         *ob = U8_ASCII_TOLOWER(*ib);
2088                                 else
2089                                         *ob = *ib;
2090                                 ib++;
2091                                 ob++;
2092                         } else {
2093                                 *errnum = 0;
2094                                 state = U8_STATE_START;
2095
2096                                 j = collect_a_seq(unicode_version, u8s,
2097                                     &ib, ibtail,
2098                                     is_it_toupper,
2099                                     is_it_tolower,
2100                                     canonical_decomposition,
2101                                     compatibility_decomposition,
2102                                     canonical_composition,
2103                                     errnum, &state);
2104
2105                                 if (*errnum && do_not_ignore_invalid) {
2106                                         ret_val = (size_t)-1;
2107                                         break;
2108                                 }
2109
2110                                 if ((obtail - ob) < j) {
2111                                         *errnum = E2BIG;
2112                                         ret_val = (size_t)-1;
2113                                         break;
2114                                 }
2115
2116                                 for (i = 0; i < j; i++)
2117                                         *ob++ = u8s[i];
2118                         }
2119                 }
2120         }
2121
2122         *inlen = ibtail - ib;
2123         *outlen = obtail - ob;
2124
2125         return (ret_val);
2126 }
2127
2128 #if defined(_KERNEL)
2129 static int __init
2130 unicode_init(void)
2131 {
2132         return (0);
2133 }
2134
2135 static void __exit
2136 unicode_fini(void)
2137 {
2138 }
2139
2140 module_init(unicode_init);
2141 module_exit(unicode_fini);
2142 #endif
2143
2144 ZFS_MODULE_DESCRIPTION("Unicode implementation");
2145 ZFS_MODULE_AUTHOR(ZFS_META_AUTHOR);
2146 ZFS_MODULE_LICENSE(ZFS_META_LICENSE);
2147 ZFS_MODULE_VERSION(ZFS_META_VERSION "-" ZFS_META_RELEASE);
2148
2149 EXPORT_SYMBOL(u8_validate);
2150 EXPORT_SYMBOL(u8_strcmp);
2151 EXPORT_SYMBOL(u8_textprep_str);