1 /* Locale dependent, case and normalization insensitive comparison of Unicode
2 strings.
3 Copyright (C) 2009-2021 Free Software Foundation, Inc.
4 Written by Bruno Haible <bruno@clisp.org>, 2009.
5
6 This file is free software.
7 It is dual-licensed under "the GNU LGPLv3+ or the GNU GPLv2+".
8 You can redistribute it and/or modify it under either
9 - the terms of the GNU Lesser General Public License as published
10 by the Free Software Foundation; either version 3, or (at your
11 option) any later version, or
12 - the terms of the GNU General Public License as published by the
13 Free Software Foundation; either version 2, or (at your option)
14 any later version, or
15 - the same dual license "the GNU LGPLv3+ or the GNU GPLv2+".
16
17 This file is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 Lesser General Public License and the GNU General Public License
21 for more details.
22
23 You should have received a copy of the GNU Lesser General Public
24 License and of the GNU General Public License along with this
25 program. If not, see <https://www.gnu.org/licenses/>. */
26
27 int
FUNC(const UNIT * s1,size_t n1,const UNIT * s2,size_t n2,const char * iso639_language,uninorm_t nf,int * resultp)28 FUNC (const UNIT *s1, size_t n1, const UNIT *s2, size_t n2,
29 const char *iso639_language, uninorm_t nf, int *resultp)
30 {
31 char buf1[2048];
32 char buf2[2048];
33 char *transformed1;
34 size_t transformed1_length;
35 char *transformed2;
36 size_t transformed2_length;
37 int cmp;
38
39 /* Normalize and transform S1. */
40 transformed1_length = sizeof (buf1);
41 transformed1 =
42 U_CASEXFRM (s1, n1, iso639_language, nf, buf1, &transformed1_length);
43 if (transformed1 == NULL)
44 /* errno is set here. */
45 return -1;
46
47 /* Normalize and transform S2. */
48 transformed2_length = sizeof (buf2);
49 transformed2 =
50 U_CASEXFRM (s2, n2, iso639_language, nf, buf2, &transformed2_length);
51 if (transformed2 == NULL)
52 {
53 if (transformed1 != buf1)
54 {
55 int saved_errno = errno;
56 free (transformed1);
57 errno = saved_errno;
58 }
59 return -1;
60 }
61
62 /* Compare the transformed strings. */
63 cmp = memcmp2 (transformed1, transformed1_length,
64 transformed2, transformed2_length);
65 if (cmp < 0)
66 cmp = -1;
67 else if (cmp > 0)
68 cmp = 1;
69
70 if (transformed2 != buf2)
71 free (transformed2);
72 if (transformed1 != buf1)
73 free (transformed1);
74 *resultp = cmp;
75 return 0;
76 }
77