doc: Document that glob includes glob_pattern_p.
[gnulib.git] / lib / uninorm / u-normxfrm.h
blob2d7f10e1d27f90ed815b776c1250b1078f294122
1 /* Locale dependent transformation for comparison of Unicode strings.
2 Copyright (C) 2009-2024 Free Software Foundation, Inc.
3 Written by Bruno Haible <bruno@clisp.org>, 2009.
5 This file is free software.
6 It is dual-licensed under "the GNU LGPLv3+ or the GNU GPLv2+".
7 You can redistribute it and/or modify it under either
8 - the terms of the GNU Lesser General Public License as published
9 by the Free Software Foundation, either version 3, or (at your
10 option) any later version, or
11 - the terms of the GNU General Public License as published by the
12 Free Software Foundation; either version 2, or (at your option)
13 any later version, or
14 - the same dual license "the GNU LGPLv3+ or the GNU GPLv2+".
16 This file is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 Lesser General Public License and the GNU General Public License
20 for more details.
22 You should have received a copy of the GNU Lesser General Public
23 License and of the GNU General Public License along with this
24 program. If not, see <https://www.gnu.org/licenses/>. */
26 char *
27 FUNC (const UNIT *s, size_t n, uninorm_t nf,
28 char *resultbuf, size_t *lengthp)
30 UNIT normsbuf[2048 / sizeof (UNIT)];
31 UNIT *norms;
32 size_t norms_length;
33 char convsbuf[2048];
34 char *convs;
35 size_t convs_length;
36 char *result;
38 /* Normalize the Unicode string. */
39 norms_length = sizeof (normsbuf) / sizeof (UNIT);
40 norms = U_NORMALIZE (nf, s, n, normsbuf, &norms_length);
41 if (norms == NULL)
42 /* errno is set here. */
43 return NULL;
45 /* Convert it to locale encoding. */
46 convs_length = sizeof (convsbuf) - 1;
47 convs = U_CONV_TO_ENCODING (locale_charset (),
48 iconveh_error,
49 norms, norms_length,
50 NULL,
51 convsbuf, &convs_length);
52 if (convs == NULL)
54 if (norms != normsbuf)
56 int saved_errno = errno;
57 free (norms);
58 errno = saved_errno;
60 return NULL;
63 if (norms != normsbuf)
64 free (norms);
66 /* Ensure one more byte is available. */
67 if (convs != convsbuf)
69 char *memory = (char *) realloc (convs, convs_length + 1);
70 if (memory == NULL)
72 free (convs);
73 errno = ENOMEM;
74 return NULL;
76 convs = memory;
79 /* Apply locale dependent transformations for comparison. */
80 result = amemxfrm (convs, convs_length, resultbuf, lengthp);
81 if (result == NULL)
83 if (convs != convsbuf)
85 int saved_errno = errno;
86 free (convs);
87 errno = saved_errno;
89 return NULL;
92 if (convs != convsbuf)
93 free (convs);
94 return result;